1MODULE DMA
2
3!  Distributed Multipole Analysis
4!
5!  Copyright (C) 2005-08  Anthony J. Stone
6!
7!  This program is free software; you can redistribute it and/or
8!  modify it under the terms of the GNU General Public License
9!  as published by the Free Software Foundation; either version 2
10!  of the License, or (at your option) any later version.
11!
12!  This program is distributed in the hope that it will be useful,
13!  but WITHOUT ANY WARRANTY; without even the implied warranty of
14!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15!  GNU General Public License for more details.
16!
17!  You should have received a copy of the GNU General Public License
18!  along with this program; if not, write to
19!  the Free Software Foundation, Inc., 51 Franklin Street,
20!  Fifth Floor, Boston, MA 02110-1301, USA.
21
22use iso_c_binding
23USE atom_grids, ONLY : grid, ng, make_grid, Lebedev,                   &
24    n_a, n_r, k_mu, start
25IMPLICIT NONE
26
27PRIVATE
28PUBLIC dma_main, c, ex, cs, cp, iax, kmin, kmax, kstart, katom, ktype, &
29    kng, kloc, maxcen, maxbfn, maxs, nat, name, nshell, title, &
30    zan, Qfactor, echarge, bohr, rfact, punchfile
31
32INTEGER, PARAMETER :: dp=kind(1d0)
33
34!  MAXS:   Maximum number of sites for a normal DMA.
35!  MAXCEN: Maximum number of atoms.
36!  MAXBFN: Maximum number of basis functions (after converting spherical
37!          basis functions to cartesian form).
38!  MAXEXP: Maximum number of primitives.
39
40INTEGER :: maxs, maxcen, maxbfn
41! INTEGER, PARAMETER :: MAXS=100, MAXCEN=100, MAXBFN=2000
42! INTEGER, PARAMETER :: MAXEXP=5000, MAXSHL=1000
43
44! bohr radius x 1e10
45REAL(dp), PARAMETER :: bohr=0.529177211d0
46REAL(dp), PARAMETER :: rtpi=1.7724538509055160272D0
47REAL(dp) :: Qfactor(0:20)=1d0
48!  elementary charge x 1e20
49REAL(dp), PARAMETER :: echarge=16.0217653d0
50
51INTEGER :: nat, nshell
52REAL(dp), ALLOCATABLE :: zan(:), c(:,:)
53
54INTEGER, ALLOCATABLE :: kstart(:), katom(:), ktype(:), kng(:),&
55    kloc(:), kmin(:), kmax(:)
56REAL(dp), ALLOCATABLE :: ex(:), cs(:), cp(:)
57
58! REAL(dp) :: ex(MAXEXP)=0d0, cs(MAXEXP)=0d0, cp(MAXEXP)=0d0!,            &
59!    cd(MAXEXP)=0d0
60
61!  IX(m) is the power of x in the mth basis function in the list s, px,
62!  py, ...
63INTEGER :: IX(56),IY(56),IZ(56)
64DATA IX(1:20) /0,  1,0,0,  2,0,0,1,1,0,  3,0,0,2,2,1,0,1,0,1/
65DATA IY(1:20) /0,  0,1,0,  0,2,0,1,0,1,  0,3,0,1,0,2,2,0,1,1/
66DATA IZ(1:20) /0,  0,0,1,  0,0,2,0,1,1,  0,0,3,0,1,0,1,2,2,1/
67DATA IX(21:35) /4,0,0,3,3,1,0,1,0,2,2,0,2,1,1/
68DATA IY(21:35) /0,4,0,1,0,3,3,0,1,2,0,2,1,2,1/
69DATA IZ(21:35) /0,0,4,0,1,0,1,3,3,0,2,2,1,1,2/
70DATA IX(36:56) /5,0,0,4,4,1,0,1,0,3,3,2,0,2,0,3,1,1,2,2,1/
71DATA IY(36:56) /0,5,0,1,0,4,4,0,1,2,0,3,3,0,2,1,3,1,2,1,2/
72DATA IZ(36:56) /0,0,5,0,1,0,1,4,4,0,2,0,2,3,3,1,1,3,1,2,2/
73
74INTEGER, ALLOCATABLE :: limit(:)
75REAL(dp), ALLOCATABLE :: xs(:,:), radius(:), q(:,:)
76REAL(dp) :: rt(0:20), binom(0:20,0:20), rtbinom(0:20,0:20),         &
77    d(56,56), qt(0:121)
78
79LOGICAL:: slice, linear, planar, general
80INTEGER :: ns, lmax, perp, mindc, maxdc
81REAL(dp) :: tol, spread
82
83!  Charge density at grid points
84REAL(dp), ALLOCATABLE :: rho(:)
85
86!  Crossover value for exponents
87REAL(dp) :: bigexp
88REAL(dp),PARAMETER :: bigexp_default=4.0
89
90!  Neglect electron density terms involving exp(-e) with e>etol
91REAL(dp) :: etol=36
92
93CHARACTER(LEN=8), ALLOCATABLE :: name(:)
94CHARACTER(LEN=80) :: title(2)
95LOGICAL :: nuclei=.true.
96
97INTEGER, ALLOCATABLE :: iax(:)
98
99REAL(dp) :: rfact=1d0
100
101CHARACTER(LEN=40) :: punchfile="gdma.punch", tempfile=""
102CHARACTER(LEN=8) :: runit
103
104!  Addresses of Gauss-Hermite points and weights.
105INTEGER :: mink(20), maxk(20)
106DATA mink /1,2,4, 7,11,16,22,29,37,46,56,67,79, 92,106,121,137,154,172,191/
107DATA maxk /1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210/
108
109!  Gauss-Hermite points and weights.
110REAL(dp) :: H(210), W(210)
111
112DATA H(1) /                                                       &
113    0.00000000000000D+00/
114DATA W(1) /                                                       &
115    1.77245385090552D+00/
116
117DATA H(2:3) /                                          &
118    -7.07106781186548D-01, 7.07106781186547D-01/
119DATA W(2:3) /                                          &
120    8.86226925452758D-01, 8.86226925452758D-01/
121
122DATA H(4:6) /                                          &
123    -1.22474487139159D+00, 0.00000000000000D+00, 1.22474487139159D+00/
124DATA W(4:6) /                                          &
125    2.95408975150920D-01, 1.18163590060368D+00, 2.95408975150920D-01/
126
127DATA H(7:10) /                                          &
128    -1.65068012388578D+00,-5.24647623275290D-01, 5.24647623275290D-01,&
129    1.65068012388578D+00/
130DATA W(7:10) /                                          &
131    8.13128354472457D-02, 8.04914090005513D-01, 8.04914090005513D-01,&
132    8.13128354472455D-02/
133
134DATA H(11:15) /                                          &
135    -2.02018287045608D+00,-9.58572464613819D-01, 0.00000000000000D+00,&
136    9.58572464613817D-01, 2.02018287045608D+00/
137DATA W(11:15) /                                          &
138    1.99532420590462D-02, 3.93619323152241D-01, 9.45308720482942D-01,&
139    3.93619323152243D-01, 1.99532420590461D-02/
140
141DATA H(16:21) /                                          &
142    -2.35060497367449D+00,-1.33584907401370D+00,-4.36077411927616D-01,&
143    4.36077411927616D-01, 1.33584907401369D+00, 2.35060497367449D+00/
144DATA W(16:21) /                                          &
145    4.53000990550896D-03, 1.57067320322857D-01, 7.24629595224393D-01,&
146    7.24629595224393D-01, 1.57067320322858D-01, 4.53000990550891D-03/
147
148DATA H(22:28) /                                          &
149    -2.65196135683523D+00,-1.67355162876747D+00,-8.16287882858965D-01,&
150    0.00000000000000D+00, 8.16287882858964D-01, 1.67355162876747D+00,&
151    2.65196135683523D+00/
152DATA W(22:28) /                                          &
153    9.71781245099546D-04, 5.45155828191274D-02, 4.25607252610128D-01,&
154    8.10264617556808D-01, 4.25607252610129D-01, 5.45155828191276D-02,&
155    9.71781245099541D-04/
156
157DATA H(29:36) /                                          &
158    -2.93063742025724D+00,-1.98165675669584D+00,-1.15719371244678D+00,&
159    -3.81186990207322D-01, 3.81186990207321D-01, 1.15719371244678D+00,&
160    1.98165675669584D+00, 2.93063742025724D+00/
161DATA W(29:36) /                                          &
162    1.99604072211375D-04, 1.70779830074137D-02, 2.07802325814892D-01,&
163    6.61147012558242D-01, 6.61147012558242D-01, 2.07802325814893D-01,&
164    1.70779830074137D-02, 1.99604072211373D-04/
165
166DATA H(37:45) /                                          &
167    -3.19099320178152D+00,-2.26658058453184D+00,-1.46855328921666D+00,&
168    -7.23551018752838D-01, 0.00000000000000D+00, 7.23551018752836D-01,&
169    1.46855328921666D+00, 2.26658058453184D+00, 3.19099320178152D+00/
170DATA W(37:45) /                                          &
171    3.96069772632663D-05, 4.94362427553707D-03, 8.84745273943779D-02,&
172    4.32651559002556D-01, 7.20235215606051D-01, 4.32651559002557D-01,&
173    8.84745273943776D-02, 4.94362427553706D-03, 3.96069772632660D-05/
174
175DATA H(46:55) /                                          &
176    -3.43615911883773D+00,-2.53273167423278D+00,-1.75668364929988D+00,&
177    -1.03661082978951D+00,-3.42901327223704D-01, 3.42901327223704D-01,&
178    1.03661082978951D+00, 1.75668364929988D+00, 2.53273167423278D+00,&
179    3.43615911883773D+00/
180DATA W(46:55) /                                          &
181    7.64043285523306D-06, 1.34364574678130D-03, 3.38743944554813D-02,&
182    2.40138611082315D-01, 6.10862633735326D-01, 6.10862633735326D-01,&
183    2.40138611082317D-01, 3.38743944554818D-02, 1.34364574678127D-03,&
184    7.64043285523290D-06/
185
186DATA H(56:66) /                                          &
187    -3.66847084655957D+00,-2.78329009978165D+00,-2.02594801582575D+00,&
188    -1.32655708449493D+00,-6.56809566882100D-01, 0.00000000000000D+00,&
189    6.56809566882098D-01, 1.32655708449493D+00, 2.02594801582575D+00,&
190    2.78329009978165D+00, 3.66847084655958D+00/
191DATA W(56:66) /                                          &
192    1.43956039371434D-06, 3.46819466323358D-04, 1.19113954449119D-02,&
193    1.17227875167709D-01, 4.29359752356125D-01, 6.54759286914592D-01,&
194    4.29359752356126D-01, 1.17227875167710D-01, 1.19113954449119D-02,&
195    3.46819466323356D-04, 1.43956039371433D-06/
196
197DATA H(67:78) /                                          &
198    -3.88972489786977D+00,-3.02063702512088D+00,-2.27950708050106D+00,&
199    -1.59768263515260D+00,-9.47788391240164D-01,-3.14240376254359D-01,&
200    3.14240376254358D-01, 9.47788391240162D-01, 1.59768263515260D+00,&
201    2.27950708050105D+00, 3.02063702512088D+00, 3.88972489786978D+00/
202DATA W(67:78) /                                          &
203    2.65855168435650D-07, 8.57368704358828D-05, 3.90539058462913D-03,&
204    5.16079856158845D-02, 2.60492310264161D-01, 5.70135236262480D-01,&
205    5.70135236262480D-01, 2.60492310264162D-01, 5.16079856158849D-02,&
206    3.90539058462919D-03, 8.57368704358820D-05, 2.65855168435644D-07/
207
208DATA H(79:91) /                                          &
209    -4.10133759617864D+00,-3.24660897837240D+00,-2.51973568567823D+00,&
210    -1.85310765160151D+00,-1.22005503659075D+00,-6.05763879171060D-01,&
211    0.00000000000000D+00, 6.05763879171059D-01, 1.22005503659074D+00,&
212    1.85310765160151D+00, 2.51973568567823D+00, 3.24660897837240D+00,&
213    4.10133759617863D+00/
214DATA W(79:91) /                                          &
215    4.82573185007318D-08, 2.04303604027083D-05, 1.20745999271943D-03,&
216    2.08627752961704D-02, 1.40323320687024D-01, 4.21616296898543D-01,&
217    6.04393187921162D-01, 4.21616296898544D-01, 1.40323320687025D-01,&
218    2.08627752961704D-02, 1.20745999271942D-03, 2.04303604027081D-05,&
219    4.82573185007342D-08/
220
221DATA H(92:105) /                                          &
222    -4.30444857047362D+00,-3.46265693360226D+00,-2.74847072498540D+00,&
223    -2.09518325850771D+00,-1.47668273114114D+00,-8.78713787329399D-01,&
224    -2.91745510672562D-01, 2.91745510672561D-01, 8.78713787329397D-01,&
225    1.47668273114114D+00, 2.09518325850771D+00, 2.74847072498539D+00,&
226    3.46265693360226D+00, 4.30444857047362D+00/
227DATA W(92:105) /                                          &
228    8.62859116812580D-09, 4.71648435501913D-06, 3.55092613551935D-04,&
229    7.85005472645823D-03, 6.85055342234660D-02, 2.73105609064247D-01,&
230    5.36405909712091D-01, 5.36405909712091D-01, 2.73105609064248D-01,&
231    6.85055342234660D-02, 7.85005472645827D-03, 3.55092613551940D-04,&
232    4.71648435501930D-06, 8.62859116812587D-09/
233
234DATA H(106:120) /                                          &
235    -4.49999070730939D+00,-3.66995037340445D+00,-2.96716692790559D+00,&
236    -2.32573248617385D+00,-1.71999257518649D+00,-1.13611558521092D+00,&
237    -5.65069583255576D-01, 0.00000000000000D+00, 5.65069583255574D-01,&
238    1.13611558521092D+00, 1.71999257518648D+00, 2.32573248617385D+00,&
239    2.96716692790560D+00, 3.66995037340444D+00, 4.49999070730938D+00/
240DATA W(106:120) /                                          &
241    1.52247580425354D-09, 1.05911554771112D-06, 1.00004441232505D-04,&
242    2.77806884291283D-03, 3.07800338725465D-02, 1.58488915795936D-01,&
243    4.12028687498899D-01, 5.64100308726418D-01, 4.12028687498900D-01,&
244    1.58488915795938D-01, 3.07800338725467D-02, 2.77806884291286D-03,&
245    1.00004441232503D-04, 1.05911554771115D-06, 1.52247580425362D-09/
246
247DATA H(121:136) /                                          &
248    -4.68873893930580D+00,-3.86944790486012D+00,-3.17699916197995D+00,&
249    -2.54620215784747D+00,-1.95178799091625D+00,-1.38025853919888D+00,&
250    -8.22951449144656D-01,-2.73481046138152D-01, 2.73481046138152D-01,&
251    8.22951449144654D-01, 1.38025853919888D+00, 1.95178799091625D+00,&
252    2.54620215784747D+00, 3.17699916197995D+00, 3.86944790486011D+00,&
253    4.68873893930581D+00/
254DATA W(121:136) /                                          &
255    2.65480747401156D-10, 2.32098084486533D-07, 2.71186009253801D-05,&
256    9.32284008624214D-04, 1.28803115355103D-02, 8.38100413989866D-02,&
257    2.80647458528534D-01, 5.07929479016614D-01, 5.07929479016614D-01,&
258    2.80647458528535D-01, 8.38100413989867D-02, 1.28803115355103D-02,&
259    9.32284008624218D-04, 2.71186009253805D-05, 2.32098084486537D-07,&
260    2.65480747401144D-10/
261
262DATA H(137:153) /                                          &
263    -4.87134519367440D+00,-4.06194667587546D+00,-3.37893209114149D+00,&
264    -2.75776291570388D+00,-2.17350282666661D+00,-1.61292431422123D+00,&
265    -1.06764872574345D+00,-5.31633001342655D-01, 0.00000000000000D+00,&
266    5.31633001342653D-01, 1.06764872574345D+00, 1.61292431422123D+00,&
267    2.17350282666661D+00, 2.75776291570388D+00, 3.37893209114148D+00,&
268    4.06194667587546D+00, 4.87134519367439D+00/
269DATA W(137:153) /                                          &
270    4.58057893079898D-11, 4.97707898163125D-08, 7.11228914002172D-06,&
271    2.98643286697763D-04, 5.06734995762769D-03, 4.09200341497568D-02,&
272    1.72648297670098D-01, 4.01826469470412D-01, 5.30917937624864D-01,&
273    4.01826469470413D-01, 1.72648297670098D-01, 4.09200341497570D-02,&
274    5.06734995762773D-03, 2.98643286697762D-04, 7.11228914002204D-06,&
275    4.97707898163130D-08, 4.58057893079903D-11/
276
277DATA H(154:171) /                                          &
278    -5.04836400887446D+00,-4.24811787356812D+00,-3.57376906848625D+00,&
279    -2.96137750553160D+00,-2.38629908916668D+00,-1.83553160426162D+00,&
280    -1.30092085838962D+00,-7.76682919267412D-01,-2.58267750519097D-01,&
281    2.58267750519096D-01, 7.76682919267409D-01, 1.30092085838961D+00,&
282    1.83553160426162D+00, 2.38629908916668D+00, 2.96137750553159D+00,&
283    3.57376906848626D+00, 4.24811787356811D+00, 5.04836400887446D+00/
284DATA W(154:171) /                                          &
285    7.82819977211642D-12, 1.04672057957931D-08, 1.81065448109359D-06,&
286    9.18112686793001D-05, 1.88852263026852D-03, 1.86400423875452D-02,&
287    9.73017476413160D-02, 2.84807285669980D-01, 4.83495694725456D-01,&
288    4.83495694725456D-01, 2.84807285669981D-01, 9.73017476413168D-02,&
289    1.86400423875452D-02, 1.88852263026848D-03, 9.18112686793015D-05,&
290    1.81065448109355D-06, 1.04672057957932D-08, 7.82819977211684D-12/
291
292DATA H(172:190) /                                          &
293    -5.22027169053746D+00,-4.42853280660377D+00,-3.76218735196401D+00,&
294    -3.15784881834759D+00,-2.59113378979453D+00,-2.04923170985061D+00,&
295    -1.52417061939353D+00,-1.01036838713431D+00,-5.03520163423888D-01,&
296    0.00000000000000D+00, 5.03520163423886D-01, 1.01036838713431D+00,&
297    1.52417061939353D+00, 2.04923170985061D+00, 2.59113378979453D+00,&
298    3.15784881834760D+00, 3.76218735196401D+00, 4.42853280660376D+00,&
299    5.22027169053747D+00/
300DATA W(172:190) /                                          &
301    1.32629709449876D-12, 2.16305100986376D-09, 4.48824314722341D-07,&
302    2.72091977631637D-05, 6.70877521407221D-04, 7.98886677772321D-03,&
303    5.08103869090527D-02, 1.83632701306997D-01, 3.91608988613031D-01,&
304    5.02974888276187D-01, 3.91608988613031D-01, 1.83632701306999D-01,&
305    5.08103869090531D-02, 7.98886677772327D-03, 6.70877521407217D-04,&
306    2.72091977631626D-05, 4.48824314722354D-07, 2.16305100986386D-09,&
307    1.32629709449867D-12/
308
309DATA H(191:210) /                                          &
310    -5.38748089001122D+00,-4.60368244955073D+00,-3.94476404011561D+00,&
311    -3.34785456738321D+00,-2.78880605842812D+00,-2.25497400208927D+00,&
312    -1.73853771211658D+00,-1.23407621539532D+00,-7.37473728545394D-01,&
313    -2.45340708300902D-01, 2.45340708300900D-01, 7.37473728545390D-01,&
314    1.23407621539532D+00, 1.73853771211658D+00, 2.25497400208927D+00,&
315    2.78880605842812D+00, 3.34785456738320D+00, 3.94476404011561D+00,&
316    4.60368244955074D+00, 5.38748089001122D+00/
317DATA W(191:210) /                                          &
318    2.22939364553440D-13, 4.39934099227386D-10, 1.08606937076940D-07,&
319    7.80255647853246D-06, 2.28338636016365D-04, 3.24377334223799D-03,&
320    2.48105208874644D-02, 1.09017206020024D-01, 2.86675505362834D-01,&
321    4.62243669600611D-01, 4.62243669600611D-01, 2.86675505362836D-01,&
322    1.09017206020025D-01, 2.48105208874642D-02, 3.24377334223800D-03,&
323    2.28338636016370D-04, 7.80255647853270D-06, 1.08606937076942D-07,&
324    4.39934099227335D-10, 2.22939364553444D-13/
325
326CONTAINS
327!-------------------------------------------------------------
328! Some getter functions to access the DMA information from C
329INTEGER(C_INT) FUNCTION get_nsites() BIND(c, name='get_nsites')
330    get_nsites = ns
331END FUNCTION get_nsites
332
333INTEGER(C_INT) FUNCTION get_order(site) BIND(c, name='get_order')
334    INTEGER(C_INT), VALUE, INTENT(IN) :: site
335    get_order = limit(site)
336END FUNCTION get_order
337
338REAL(C_DOUBLE) FUNCTION get_dma_value(site, addr) BIND(c, name='get_dma_value')
339    INTEGER(C_INT), VALUE, INTENT(IN) :: site, addr
340    get_dma_value = q(addr,site)
341END FUNCTION get_dma_value
342
343REAL(C_DOUBLE) FUNCTION get_tot_value(addr) BIND(c, name='get_tot_value')
344    INTEGER(C_INT), VALUE, INTENT(IN) :: addr
345    get_tot_value = qt(addr)
346END FUNCTION get_tot_value
347!-----------------------------------------------------------------   DMA
348
349SUBROUTINE dma_main(w,kp,infile,outfile)
350USE input
351IMPLICIT NONE
352!-----------------------------------------------------
353!     Copyright A J Stone University of Cambridge 1983
354!     Modifications and interface to Cadpac, R D Amos
355!     Version for Cadpac5 , R D Amos, June 1990
356!-----------------------------------------------------
357REAL(dp) :: w(*)
358INTEGER :: kp, prank=5, infile, outfile
359
360!                      Distributed Multipole Analysis
361
362!  The charge distribution is analysed by treating the overlap density
363!  of each pair of primitives as a multipole expansion about the centre
364!  of the overlap distribution. This expansion (which terminates) is
365!  then moved to the nearest of a list of expansion sites, giving a
366!  non-terminating but rapidly convergent expansion. By default, the
367!  expansion sites comprise the nuclei, but sites can be deleted or
368!  additional ones added. An additional site at the centre of the
369!  molecule is recommended for example if there is no atom there. It is
370!  possible to specify the maximum rank of multipole which can be
371!  generated at any site; multipoles of higher rank which would have
372!  been moved to such limited sites are moved to other other sites
373!  instead.
374!  Normally the SCF density matrix is analysed, but it is possible to
375!  specify other density matrices, generated for example by
376!  perturbations arising from correlation or external fields, or by
377!  CASSCF or MCSCF calculation.
378
379LOGICAL eof
380
381CHARACTER(LEN=8) :: aa, posn
382CHARACTER(LEN=16) :: wa, wb, wc
383
384LOGICAL :: check
385
386INTEGER :: iw=6, kr=0, kw=0, nerror=0, itol, zs(MAXS)
387INTEGER :: i, j, k, l, m, ok
388REAL(dp) :: r, ox=0d0, oy=0d0, oz=0d0
389
390!  Directive syntax:
391!   MULTIPOLES
392!   [options]
393!   START
394
395!  Options specifying the choice of sites should be given first, followed
396!  by other options as required. Sites are specified by:
397
398!  ATOMS   (default) Move all contributions to nearest atom.
399
400!  DELETE name
401!          Delete all sites with the name given.  DELETE ALL deletes
402!          all sites. DELETE CHARGE imol  deletes nuclear charges on
403!          atoms in molecule imol=1,2. If only one molecule is present
404!          imol can be omitted.
405
406!  ADD name x y z [LIMIT lmax] [RADIUS radius]
407!          Add a new site at (x,y,z) with the name specified.  The
408!          multipole rank is limited to lmax if a value is specified,
409!          and a relative radius can be specified also (see below).
410
411!  The program automatically takes advantage of the geometry of the molecule
412!  and the sites chosen to use the fastest algorithm. For calculation of
413!  distributed multipoles there is a faster procedure that is suitable
414!  when the molecule is linear and arranged parallel to the z axis.
415!  However it is possible to override the automatic
416!  selection. In particular, it is necessary to specify GENERAL for a linear
417!  molecule that is subject to an external field, or is not in a singlet
418!  sigma state. If such a molecule is treated as linear, there may be
419!  non-vanishing multipole moments which will not be calculated; however
420!  the Ql0 will still be correct.
421
422!  GENERAL Ignore any special features of the geometry and use the most
423!          general version of the calculation.
424
425!  LIMIT lmax [name name ...]
426!          Limit the rank of multipoles on sites with any of the names
427!          given to lmax at most.  (Contributions with higher ranks are
428!          moved to other sites.) If no name is given the limit applies
429!          all sites. Default (and maximum) is 20 for the linear
430!          version, 10 otherwise.
431
432!  RADIUS radius name name ...
433!          Specify a radius for sites with any of the names given.
434!          The actual distances from an overlap centre to the sites are
435!          scaled by dividing by the radii of the sites, and
436!          the contributions are moved to the site which is closest, in
437!          terms of scaled distances, to the overlap centre. The default
438!          is that all sites have radius 0.65 angstrom, except for
439!          hydrogen, which has radius 0.325 angstrom.
440
441!  BIGEXP e
442!          If the sum of the exponents of a pair of primitives is greater
443!          than e, and they are on the same atom, use conventional DMA to
444!          handle the multipoles. If it is less than e, evaluate the
445!          electron density associated with this pair of primitives and
446!          obtain the multipole contributions by integration over a grid.
447!          Default value 1.0.
448
449!  PUNCH [file] [RANK prank] [APPEND]
450!          Write the multipole moments to the specified file.
451!          The moments are given in a form suitable for re-input to the
452!          ORIENT program, together with the site names and positions.
453!          Multipoles above rank prank (default 5) are not output. APPEND
454!          causes the output to be appended to the specified file.
455
456!  REPORT  Print the multipole contributions of each pair of primitives
457!          as the calculation proceeds.
458
459!  NONUCLEAR
460!          The nuclear contribution is not to be evaluated.
461
462!  SLICE
463!          (For LINEAR molecules only.) Evaluate integrals over slices
464!          of space each containing one DMA site. The positions of the
465!          dividing planes between the slices are determined by reference
466!          to the site radii. In the calculation of DMA matrices for
467!          linear molecules this procedure is always used.
468
469lmax=20
470iw=outfile
471kr=0
472kw=0
473linear=.false.
474planar=.false.
475general=.false.
476perp=0
477itol=18
478nuclei=.true.
479slice=.false.
480spread=1.0d0
481bigexp=bigexp_default
482lebedev=.true.
483nerror=0
484iax(1)=0
485do i=1,maxbfn
486  iax(i+1)=iax(i)+i
487end do
488if (rfact==1d0) then
489  runit="bohr"
490else
491  runit="angstrom"
492end if
493
494if (allocated(limit)) deallocate(limit,xs,radius,q)
495allocate(limit(maxs),xs(3,maxs),radius(maxs),q(0:121,maxs),stat=ok)
496if (ok>0) call die("Can't allocate site arrays")
497
498!  ATOMS (default choice of sites)
499call atom_sites
500
501!  Read input keywords
502do
503  if (nerror .eq. 1) then
504    write(outfile, '(a)') 'Syntax checking only from this point.'
505    nerror=nerror+1
506  endif
507  call read_line(eof, infile)
508  call readu(wa)
509  select case(wa)
510  case('ATOMS')  !  Default choice of sites
511    call atom_sites
512  case('MODIFY','END','NOTE',"","!")
513    !  Ignore
514  case('START')
515    exit
516  case('LINEAR')
517    write(outfile, '(/A)') 'The LINEAR option is no longer needed'
518  case('PLANAR')
519    call readu(wb)
520    select case(wb)
521    case('X','YZ')
522      i=1
523      wc='yz'
524    case('Y','XZ')
525      i=2
526      wc='xz'
527    case("",'Z','XY')
528      i=4
529      wc='xy'
530    end select
531    if (linear .and. (i .eq. 1 .or. i .eq. 2)) then
532      linear=.false.
533      planar=.true.
534      perp=i
535    else if (.not. planar .or. perp .ne. i) then
536      write (iw,'(3a)')                                          &
537          'The sites are not arranged parallel to the ',             &
538          WC(1:2),' plane.'
539      call die('Calculation abandoned')
540    endif
541
542  case('GENERAL')
543    !  Override automatic switches
544    general=.true.
545    linear=.false.
546    planar=.false.
547    perp=0
548
549  case('SPREAD')
550    call readf(spread,rfact)
551    if (spread .eq. 0.0d0) spread=1.0d0
552
553  case("GRID")
554    do while (item < nitems)
555      call readu(wa)
556      select case(wa)
557      case("RADIAL")
558        call readi(n_r)
559      case("LEBEDEV")
560        call readi(n_a)
561        Lebedev=.true.
562      case("GAUSS-LEGENDRE", "LEGENDRE")
563        Lebedev=.false.
564        call readi(n_a)
565      case("BECKE","SMOOTHING")
566        call readi(k_mu) ! Default is 3
567!     case("RADII")
568!       call readu(wa)
569!       select case(wa)
570!       case("SLATER","ON")
571!         Slater=.true.
572!       case("EQUAL","OFF")
573!         Slater=.false.
574!       case default
575!         call die ("Grid radii option "//trim(wa)//" not recognised",.true.)
576!       end select
577      case default
578        call die ("Grid option "//trim(wa)//" not recognised",.true.)
579      end select
580    end do
581
582  case('REPORT')
583    if (nitems .gt. 1) then
584      call readi(kr)
585    else
586      kr=7
587    endif
588    if (kr .gt. 1) kw=iw
589
590  case('PUNCH')
591    if (kp .eq. 0) then
592      posn="rewind"
593    else
594      posn="append"
595    endif
596    do while (item .lt. nitems)
597      call readu(wa)
598      select case(wa)
599      case("APPEND")
600        posn="append"
601      case("RANK")
602        call readi(prank)
603      case default
604        call reread(-1)
605        call reada(tempfile)
606        if (tempfile .ne. punchfile .and. kp .ne. 0) then
607          close(kp)
608          kp=0
609          posn="rewind"
610        endif
611        punchfile=tempfile
612      end select
613    end do
614    if (kp .eq. 0) then
615      inquire(file=punchfile,exist=check)
616      if (check) then
617        open(unit=7,file=punchfile,position=posn)
618      else
619        open(unit=7,file=punchfile)
620      endif
621      kp=7
622    endif
623
624  case('NONUCLEAR')
625    nuclei=.false.
626
627  case('DELETE')  !  Delete sites
628    call readu(wb)
629    if (wb .eq. 'ALL') then
630      !  Delete all sites
631      ns=0
632    else
633      !  Delete sites matching name given
634      k=0
635      call reread(-1)
636      call reada(aa)
637      do i=1,ns
638        if (aa .ne. name(i)) then
639          k=k+1
640          if (k .ne. i) then
641            name(k)=name(i)
642            do j=1,3
643              xs(j,k)=xs(j,i)
644            end do
645            limit(k)=limit(i)
646            radius(k)=radius(i)
647          endif
648        endif
649      end do
650      ns=k
651    endif
652    !  Recalculate linear/planar switches
653    call planes
654
655  case('SLICE')
656    slice=.true.
657
658  !  LIMIT limit [site site ...]
659  case("LIMIT")
660    call readi(l)
661    l=min(l,20)
662    if (item < nitems) then
663      do while (item < nitems)
664        call reada(aa)
665        do i=1,ns
666          if (name(i) .eq. aa) limit(i)=l
667        end do
668      end do
669    else
670      lmax=l
671      do i=1,ns
672        limit(i)=min(lmax,limit(i))
673      end do
674    endif
675
676  !  RADIUS name radius name radius ...
677  case('RADIUS')
678    ! check=.false.
679    do while (item<nitems)
680      call reada(aa)
681      call readf(r,rfact)
682      do i=1,ns
683        if (name(i) .eq. aa) then
684          radius(i)=r
685          check=.true.
686        endif
687      end do
688      ! if (.not. check) then
689      !   print '(3a)', 'Name ', trim(aa), ' not found.'
690      !   nerror=nerror+1
691      ! endif
692    end do
693
694  case('ORIGIN')
695    call readf(ox,rfact)
696    call readf(oy,rfact)
697    call readf(oz,rfact)
698
699  case('ADD')
700    !  ADD site x y z [LIMIT limit] [RADIUS radius]
701    if (ns .ge. maxs) then
702      write (iw,'(a,i4)') 'Too many sites -- maximum is', MAXS
703      nerror=nerror+1
704    else
705      ns=ns+1
706    endif
707    call reada(aa)
708    name(ns)=aa
709    do i=1,3
710      call readf(xs(i,ns),rfact)
711    end do
712    limit(ns)=lmax
713    radius(ns)=0.65d0/bohr
714    zs(ns)=0
715    do while (item < nitems)
716      call readu(aa)
717      select case(aa)
718      case("LIMIT")
719        call readi(limit(ns))
720      case("RADIUS")
721        call readf(radius(ns),rfact)
722      end select
723    end do
724!  Recalculate linear/planar switches
725    call planes
726
727! case("RADII")
728!   call readu(aa)
729!   select case(aa)
730!   case("EQUAL")
731!     do i=1,ns
732!       radius(i)=0.5d0/bohr
733!     end do
734!   case("DEFAULT","SLATER")
735!     do i=1,ns
736!       radius(i)=slater_radius(zs(i))
737!     end do
738!   end select
739
740  case("BIGEXP","SWITCH")
741    call readf(bigexp)
742    if (bigexp < 0d0) then
743      write(outfile,"(a)") "Switch value must not be negative"
744      nerror=nerror+1
745    end if
746    if (bigexp > 0d0) general=.true.
747
748  case default
749    write(outfile,'(a,a)') 'Unrecognised DMA keyword ', wa
750    nerror=nerror+1
751  end select
752end do
753
754!  START
755
756if (nerror .gt. 0) then
757  call die ('Multipoles directive not executed.',.false.)
758endif
759
760binom(0,0)=1.0d0
761rtbinom(0,0)=1d0
762rt(0)=0.0d0
763do k=1,20
764  rt(k)=sqrt(dble(k))
765  binom(k,0)=1.0d0
766  rtbinom(k,0)=1.0d0
767  binom(k-1,k)=0.0d0
768  do m=1,k
769    binom(k,m)=binom(k-1,m-1)+binom(k-1,m)
770    rtbinom(k,m)=sqrt(binom(k,m))
771  end do
772end do
773
774if (.not. linear) lmax=min0(lmax,10)
775
776l=0
777do i=1,ns
778  limit(i)=min0(lmax,limit(i))
779  l=max0(l,limit(i))
780end do
781lmax=l
782
783tol=2.30258d0*itol
784
785!  Standard DMA
786
787write (iw,"(/25x,a/)") "Distributed Multipole Analysis"
788
789Q=0.0d0
790
791if (bigexp > 0d0) then
792  write(outfile,"(a,a,f0.5)") "Standard DMA for products of primitives",  &
793      " with exponent greater than ", bigexp
794  general=.true.
795  call make_grid(ns, zs, xs, radius, outfile)
796  if (allocated(rho)) then
797    deallocate(rho)
798  end if
799  allocate(rho(ng), stat=ok)
800  if (ok>0) then
801    write(outfile,"(a)") "Allocation of density grid failed"
802    stop
803  end if
804else
805  write(outfile, "(a)") "Standard DMA"
806end if
807
808if (general) then
809  !  Override automatic switches
810  linear=.false.
811  planar=.false.
812  perp=0
813end if
814
815write(outfile, "(/2a)") "Positions and radii in ", trim(runit)
816
817if (Qfactor(0) .ne. 1d0) then
818  write(outfile, "(/a)") "Multipole moments are in SI units, multiplied by 10^(10k+20) for rank k"
819else
820  write(outfile, "(a)") "Multipole moments in atomic units, ea_0^k for rank k"
821end if
822
823if (linear) then
824  call dmaql0(w,kw)
825else
826  call dmaqlm(w,kw)
827endif
828
829qt=0.0d0
830
831if (kp .gt. 0) then
832  !  Heading for 'punch' results
833  write (kp,'(2a)') ("! ", trim(title(i)), i=1,2)
834  write (kp,"(2a)") "Units ", trim(runit)
835endif
836
837do i=1,ns
838!  Print results for site I
839  write (iw,"(/a8,3(a,f10.6),1x,a/8x,a,i3,a,f7.3,1x,a)")               &
840      name(i),                                                         &
841      '   x =', xs(1,i)*rfact, '  y =', xs(2,i)*rfact,                 &
842      '  z =', xs(3,i)*rfact, trim(runit), &
843      '   Maximum rank =', limit(i),                                   &
844      '   Radius =', radius(i)*rfact, trim(runit)
845  call printq(q(0:,i),limit(i), linear, iw)
846  if (kp .gt. 0) then
847    !  'Punch' results
848    if (linear) then
849      write (kp,'(/a8,f16.10,4x,a,i3)')                                &
850          name(i), xs(3,i)*rfact, 'Rank', min(prank,limit(i))
851      write (kp,'(f15.10)') (q(l,i), l=0,min(prank,limit(i)))
852    else
853      write (kp,'(/a8,3f16.10,4x,a,i3)')                               &
854          name(i), xs(:,i)*rfact, 'Rank', min(prank,limit(i))
855      do l=0,min(prank,limit(i))
856        write (kp,'(5(f15.10))') (q(k,i), k=l**2+1,(l+1)**2)
857      end do
858    endif
859  endif
860!  Shift total for site I to origin
861  if (linear) then
862    call shiftz(q(0:,i),0,limit(i), qt,lmax, xs(3,i)-oz)
863  else
864    call shiftq(q(1:,i),0,limit(i), qt(1:),lmax,                       &
865        xs(1,i)-ox, xs(2,i)-oy, xs(3,i)-oz)
866  endif
867end do
868
869!  Print total multipoles
870if (linear) then
871  write (iw,"(/a,f11.6,1x,a)")                                         &
872      'Total multipoles referred to origin at z =', oz*rfact, trim(runit)
873else
874  write (iw,'(/a/10x,3(a,f11.6),1x,a)')                                &
875      "Total multipoles referred to origin at", " x =", ox*rfact,      &
876      ',  y = ', oy*rfact, ',  z = ', oz*rfact, trim(runit)
877endif
878call printq(qt,lmax, linear, iw)
879
880if (bigexp > 0d0) deallocate(rho)
881
882CONTAINS
883
884SUBROUTINE atom_sites
885
886mindc=1
887maxdc=maxcen
888do i=1,nat
889  xs(:,i)=c(:,i)
890  limit(i)=lmax
891  zs(i)=nint(zan(i))
892  if (zs(i)==1) then
893    !  Hydrogen atoms have default radius 0.325 Angstrom
894    radius(i)=0.325d0/bohr
895  else
896    !  Otherwise the default radius is 0.65 Angstrom
897    radius(i)=0.65d0/bohr
898  end if
899end do
900ns=nat
901
902call planes
903
904END SUBROUTINE atom_sites
905
906END SUBROUTINE dma_main
907
908!---------------------------------------------------------------  DMAQL0
909
910SUBROUTINE dmaql0(densty,iw)
911IMPLICIT NONE
912!-----------------------------------------------------
913!     Copyright A J Stone University of Cambridge 1983
914!     Modifications and interface to Cadpac, R D Amos
915!     Version for Cadpac5 , R D Amos, June 1990
916!-----------------------------------------------------
917REAL(dp) :: densty(*)
918INTEGER :: iw
919
920!  Calculate multipole moments, and shift them to the nearest site. In
921!  this routine, appropriate for linear molecules, only the moments Qlm
922!  with m=0 are calculated and stored, and they are held in the order
923!  Q0, Q1, Q2, ...
924!  If IW>0, print details of the progress of the calculation.
925!  If NUCLEI, include the nuclear charges in the calculation.
926!  BINOM(K,M) contains the binomial coefficient (K).
927!                                               (M)
928!  RT(K) contains sqrt(K).
929
930LOGICAL :: ieqj, iieqjj, skip
931
932REAL(dp) :: gx(0:20), gz(0:20,0:5,0:5), sep(0:maxs),                   &
933    qt(0:20)
934INTEGER :: sort(maxs)
935
936INTEGER :: i, i1, i2, ia, ib, ii, ii1, ii2, ig, iq, iqmin, is,         &
937    j, j1, j2, jb, jj, jj1, jj2, jg, jgmax, js, k, k1, k2,             &
938    la, lb, loci, locj, m, mx, my, mini, maxi, minj, maxj, nq
939REAL(dp) :: aa, ai, arri, aj, ci, cj, dum, fac, g,                     &
940    p, paz, pq, pz, ps, rr, s, t,                                      &
941    z1, z2, za, zas, zb, zbs, zp, zi, zj, zji, zs
942
943if (slice) then
944  lmax=min(lmax,11)
945  do is=1,ns
946    limit(is)=min(limit(is),lmax)
947  end do
948  !  Sort DMA sites into order of increasing z.
949  do is=1,ns
950    sort(is)=is
951  end do
952  do is=2,ns
953    js=is
954    do while (js>1)
955      if (xs(3,sort(js)) .ge. xs(3,sort(js-1))) exit
956      m=sort(js)
957      sort(js)=sort(js-1)
958      sort(js-1)=m
959      js=js-1
960    end do
961  end do
962!  Coordinates of separating planes
963  sep(0)=-1.0d6
964  do is=1,ns-1
965    i1=sort(is)
966    i2=sort(is+1)
967    sep(is)=(radius(i1)*xs(3,i2)+radius(i2)*xs(3,i1))                  &
968        /(radius(i1)+radius(i2))
969  end do
970  sep(ns)=1.0d6
971  if (iw .gt. 0) write (iw,"(a//(28x, f14.4 / 1x, i4, i8, f10.4))")    &
972      ' slice        site               separator',                    &
973      sep(0), (is, sort(is), xs(3,sort(is)), sep(is), is=1,ns)
974  if (iw .gt. 0) write (iw,'(a/a/)')                                   &
975      '   Atoms   Shells Primitives  Position',                        &
976      'Slice     Multipole contributions ...'
977else
978  if (iw .gt. 0) write (iw,'(/a,a/)')                                  &
979      '    Atoms   Shells Primitives  Position',                       &
980      '  Multipole contributions ...'
981endif
982
983!  Clear temporary multipole array. Note that subsequently it is cleared
984!  whenever multipoles are moved from it to an expansion site.
985qt(0:lmax)=0.0d0
986
987!  Loop over pairs of atoms
988katom(nshell+1)=0
989do i=1,nat
990  zi=c(3,i)
991  if (nuclei .and. i .ge. mindc .and. i .le. maxdc) then
992    qt(0)=zan(i)
993    call movez(qt, zi, iw)
994  endif
995  !  Find shells for atom i
996  ii1=0
997  ishells: do ii=1,nshell
998    if (katom(ii) .eq. i) then
999      ii1=ii
1000      do k=ii1,nshell+1
1001        if (katom(k) .ne. i) then
1002          ii2=k-1
1003          exit ishells
1004        end if
1005      end do
1006    end if
1007  end do ishells
1008  if (ii1 .eq. 0) cycle  !  No basis functions on atom I
1009
1010  !  Loop over shells for atom i
1011  do ii=ii1,ii2
1012    i1=kstart(ii)
1013    i2=i1+kng(ii)-1
1014    la=ktype(ii)-1
1015    mini=kmin(ii)
1016    maxi=kmax(ii)
1017    loci=kloc(ii)-mini
1018
1019    !  Loop over atoms j
1020    do j=1,i
1021      ieqj=i .eq. j
1022      zj=c(3,j)
1023      zji=zi-zj
1024      rr=zji**2
1025
1026      !  Find shells for atom j
1027      jj1=0
1028      jshells: do jj=1,nshell
1029        if (katom(jj) .eq. j) then
1030          jj1=jj
1031          do k=jj1,nshell+1
1032            if (katom(k) .ne. j) then
1033              jj2=k-1
1034              exit jshells
1035            end if
1036          end do
1037        end if
1038      end do jshells
1039      if (jj1 .eq. 0) cycle  !  No basis functions on atom j
1040
1041      !  Loop over shells for atom j
1042      if (ieqj) jj2=ii
1043      do jj=jj1,jj2
1044        j1=kstart(jj)
1045        j2=j1+kng(jj)-1
1046        lb=ktype(jj)-1
1047        minj=kmin(jj)
1048        maxj=kmax(jj)
1049        locj=kloc(jj)-minj
1050        iieqjj=ii.eq.jj
1051        !  Set up temporary density matrix for this pair of shells
1052        do ib=mini,maxi
1053          m=iax(loci+ib)
1054          if (iieqjj) then
1055            do jb=minj,ib
1056              d(ib,jb)=densty(m+locj+jb)
1057              d(jb,ib)=densty(m+locj+jb)
1058            end do
1059          else
1060            do jb=minj,maxj
1061              d(ib,jb)=densty(m+locj+jb)
1062            end do
1063          end if
1064        end do
1065        !  Insert factors of sqrt(3) for xy, xz and yz functions, if present,
1066        !  and factors of sqrt(5) and sqrt(15) for f functions. This is to
1067        !  compensate for the use of the same normalisation factor in all the
1068        !  d integrals and in all the f integrals.
1069        select case(la)
1070        case(2)
1071          d(8:10,minj:maxj)=rt(3)*d(8:10,minj:maxj)
1072        case(3)
1073          d(14:19,minj:maxj)=rt(5)*d(14:19,minj:maxj)
1074          d(20,minj:maxj)=rt(15)*d(20,minj:maxj)
1075        case(4)
1076          d(24:29,minj:maxj)=rt(7)*d(24:29,minj:maxj)
1077          d(30:32,minj:maxj)=(rt(5)*rt(7)/rt(3))*d(30:32,minj:maxj)
1078          d(33:35,minj:maxj)=rt(5)*rt(7)*d(33:35,minj:maxj)
1079        end select
1080        select case(lb)
1081        case(2)
1082          d(mini:maxi,8:10)=rt(3)*d(mini:maxi,8:10)
1083        case(3)
1084          d(mini:maxi,14:19)=rt(5)*d(mini:maxi,14:19)
1085          d(mini:maxi,20)=rt(15)*d(mini:maxi,20)
1086        case(4)
1087          d(mini:maxi,24:29)=rt(7)*d(mini:maxi,24:29)
1088          d(mini:maxi,30:32)=(rt(5)*rt(7)/rt(3))*d(mini:maxi,30:32)
1089          d(mini:maxi,33:35)=rt(5)*rt(7)*d(mini:maxi,33:35)
1090        end select
1091
1092        !  I primitive
1093        jgmax=j2
1094        do ig=i1,i2
1095          ai=ex(ig)
1096          arri=ai*rr
1097          !  J primitive
1098          if (iieqjj) jgmax=ig
1099          do jg=j1,jgmax
1100            aj=ex(jg)
1101            aa=ai+aj
1102            dum=aj*arri/aa
1103            if (dum.gt.tol) cycle
1104            fac=dexp(-dum)
1105!  Introduce factor of 2 if (a) shells are different (II.NE.JJ) because
1106!  loops over atoms and shells count each pair only once, and (b) if
1107!  II.EQ.JJ but IG.NE.JG, because loops over primitives count each pair
1108!  only once.  In fact IG.NE.JG covers both cases.  However, different
1109!  atoms may use the same shells and primitives if there is symmetry, an
1110!  there is always a factor of 2 if the atoms are different.
1111            if (ig .ne. jg .or. .not. ieqj) fac=2.0d0*fac
1112            !  ZP is the position of the overlap centre.
1113            p=aj/aa
1114            zp=zi-p*zji
1115            za=zi-zp
1116            zb=zj-zp
1117            if (iw .gt. 0) write (iw,"(3(i5,i4), f11.4)")              &
1118                i,j, ii,jj, ig,jg, zp
1119!  Use numerical integration to evaluate the multipole integrals
1120!  over x and y (they are the same).
1121            t=dsqrt(1.0d0/aa)
1122!  The x integrals involve polynomials up to order LA+LB+LMAX,
1123!  for which NQ+1 integration points are required.
1124            if (slice) then
1125              nq=(la+lb+lmax)/2
1126            else
1127              nq=la+lb
1128            endif
1129            k1=mink(nq+1)
1130            k2=maxk(nq+1)
1131            gx(0:20)=0.0d0
1132!  In GX it is only necessary to accumulate the sums of even powers of
1133!  xk:
1134!           sum(k) gk * xk**(IQ),  IQ even,
1135!  since xA=xB=0. The same values serve for GY.
1136            do k=k1,k2
1137              s=h(k)*t
1138              g=w(k)*t
1139              ps=g
1140              iqmin=min((la+lb+lmax),20)
1141              do iq=0,iqmin,2
1142                gx(iq)=gx(iq)+ps
1143                ps=ps*(s**2)
1144              end do
1145            end do
1146
1147            if (slice) then
1148
1149!  Use the analytical formula, and recursion formulae, to evaluate
1150!  integrals over slices of space each containing one DMA site.
1151!  Loop over slices
1152              do is=1,ns
1153                z1=sep(is-1)-zp
1154                z2=sep(is)-zp
1155                call dmaerf(aa,la,lb, za,zb, z1,z2, gz, skip)
1156!  If SKIP, all the integrals in GZ are negligible.
1157                if (skip) cycle
1158
1159!  Now these basic integrals are used to construct the multipole moments
1160!  for the overlap density corresponding to each pair of basis functions
1161!  in the pair of shells.
1162                qt(0:lmax)=0.0d0
1163                ci=cs(ig)
1164                do ia=mini,maxi
1165                  if (ia .gt. 1 .and. la .eq. 1) ci=cp(ig)
1166                  ! if (ia .gt. 4) ci=cd(ig)
1167                  cj=cs(jg)
1168                  do jb=minj,maxj
1169                    if (jb .gt. 1 .and. lb .eq. 1) cj=cp(jg)
1170                    ! if (jb .gt. 4) cj=cd(jg)
1171!  The integral of (x**i)*(y**j)*(z**k) over the current pair of atomic
1172!  primitive orbitals is F*GX(MX+i)*GY(MY+j)*GZ(k,IZ(IA),IZ(IB)), and is
1173!  zero unless both MX and MY are even.
1174                    mx=ix(ia)+ix(jb)
1175                    my=iy(ia)+iy(jb)
1176                    if (mod(mx,2) .eq. 0 .and. mod(my,2) .eq. 0)       &
1177                        call addql0(qt, lmax, -fac*ci*cj*d(ia,jb),     &
1178                        gx(mx),gx(my),gz(0,iz(ia),iz(jb)))
1179!  End of loop over basis functions
1180                  end do
1181                end do
1182                if (iw .gt. 0) write (iw,"(a,i3, 11f11.7)")            &
1183                    "slice", is, (qt(iq), iq=0,min(lmax,10))
1184!  Move multipoles to expansion site contained in this slice.
1185!  Note that they are currently referred to the overlap centre P.
1186                zs=xs(3,sort(is))
1187                call shiftz(qt,0,lmax, q(0:,sort(is)),lmax, zp-zs)
1188!  End of loop over slices
1189              end do
1190
1191
1192            else  !  if not slice
1193
1194
1195!  Clear integral arrays
1196              gz(0:20,0:5,0:5)=0.0d0
1197
1198!  The following loop runs through the integration points, accumulating
1199!  in GZ(IQ,IA,IB) the quantity
1200!       sum(k) gk * (zk-zA)**IA * (zk-zB)**IB * zk**IQ
1201!  where gk=w(k)/sqrt(AA) and zk=h(k)/sqrt(AA).
1202              do k=k1,k2
1203                s=h(k)*t
1204                g=w(k)*t
1205                zas=s-za
1206                zbs=s-zb
1207                paz=g
1208                do ia=0,la
1209                  pz=paz
1210                  do ib=0,lb
1211                    pq=pz
1212                    do iq=0,la+lb
1213                      gz(iq,ia,ib)=gz(iq,ia,ib)+pq
1214                      pq=pq*s
1215                    end do
1216                    pz=pz*zbs
1217                  end do
1218                  paz=paz*zas
1219                end do
1220              end do
1221
1222!  Now these basic integrals are used to construct the multipole moments
1223!  for the overlap density corresponding to each pair of basis functions
1224!  in the pair of shells.
1225              qt(0:lmax)=0.0d0
1226              ci=cs(ig)
1227              do ia=mini,maxi
1228                if (ia .gt. 1 .and. la .eq. 1) ci=cp(ig)
1229                ! if (ia .gt. 4) ci=cd(ig)
1230                cj=cs(jg)
1231                do jb=minj,maxj
1232                  if (jb .gt. 1 .and. lb .eq. 1) cj=cp(jg)
1233                  ! if (jb .gt. 4) cj=cd(jg)
1234!  The integral of (x**i)*(y**j)*(z**k) over the current pair of atomic
1235!  primitive orbitals is F*GX(MX+i)*GY(MY+j)*GZ(k,IZ(IA),IZ(JB)), and
1236!  is zero unless both MX and MY are even.
1237                  mx=ix(ia)+ix(jb)
1238                  my=iy(ia)+iy(jb)
1239                  if (mod(mx,2) .eq. 0 .and. mod(my,2) .eq. 0)         &
1240                      call addql0 (qt, min(nq,lmax), -fac*ci*cj*d(ia,jb), &
1241                      gx(mx),gx(my),gz(0,iz(ia),iz(jb)))
1242                  if (iw .gt. 0) write (iw,"(1p,3e10.2,2i3,1p,4e10.2)") &
1243                      fac, ci, cj, ia, jb, d(ia,jb),                   &
1244                      gx(mx), gx(my), gz(0,iz(ia),iz(jb))
1245!  End of loop over basis functions
1246                end do
1247              end do
1248              if (iw .gt. 0) write (iw,"(3(i5,i4), f11.4, 3x, 11f12.8)") &
1249                  i,j, ii,jj, ig,jg, zp, (qt(iq), iq=0,10)
1250!  Move multipoles to nearest site.
1251              call movez(qt, zp, iw)
1252            endif
1253!  End of loop over primitives
1254          end do
1255        end do
1256        if (iw .gt. 0) write (iw,"(/(5f15.8))")                        &
1257            (q(0:4,ia), ia=1,ns)
1258        if (iw .gt. 0) write (iw,"(1x)")
1259!  End of loop over shells
1260      end do
1261    end do
1262  end do
1263!  End of loop over atoms
1264end do
1265
1266END SUBROUTINE dmaql0
1267
1268!-----------------------------------------------------------------ADDQL0
1269
1270SUBROUTINE ADDQL0(Q, L, F, GX,GY,GZ)
1271IMPLICIT NONE
1272!-----------------------------------------------------
1273!     Copyright A J Stone University of Cambridge 1983
1274!     Modifications and interface to Cadpac, R D Amos
1275!     Version for Cadpac5 , R D Amos, June 1990
1276!-----------------------------------------------------
1277REAL(dp),INTENT(IN) :: GX(0:*), GY(0:*), GZ(0:*), F
1278INTEGER,INTENT(IN) :: L
1279REAL(dp),INTENT(INOUT) :: Q(0:*)
1280
1281REAL(dp) :: xy0, xy2, xy4, xy6, xy8, xy10
1282
1283GO TO (100,101,102,103,104,105,106,107,108,109,110,111), L+1
1284111   CONTINUE
1285110   XY10=GX(10)*GY(0)+5.0D0*GX(8)*GY(2)+10.0D0*GX(6)*GY(4)+           &
1286                  10.0D0*GX(4)*GY(6)+5.0D0*GX(2)*GY(8)+GX(0)*GY(10)
1287109   CONTINUE
1288108   XY8=GX(8)*GY(0)+4.0D0*GX(6)*GY(2)+6.0D0*GX(4)*GY(4)+              &
1289                                4.0D0*GX(2)*GY(6)+GX(0)*GY(8)
1290107   CONTINUE
1291106   XY6=GX(6)*GY(0)+3.0D0*GX(4)*GY(2)+3.0D0*GX(2)*GY(4)+GX(0)*GY(6)
1292105   CONTINUE
1293104   XY4=GX(4)*GY(0)+2.0D0*GX(2)*GY(2)+GX(0)*GY(4)
1294103   CONTINUE
1295102   XY2=GX(2)*GY(0)+GX(0)*GY(2)
1296101   CONTINUE
1297100   XY0=GX(0)*GY(0)
1298GO TO (200,201,202,203,204,205,206,207,208,209,210,211), L+1
1299211   Q(11)=Q(11)+0.00390625D0*F*                                       &
1300          (256.0D0*XY0*GZ(11)                                           &
1301          -7040.0D0*XY2*GZ(9)                                           &
1302          +31680.0D0*XY4*GZ(7)                                          &
1303          -36960.0D0*XY6*GZ(5)                                          &
1304          +11550.0D0*XY8*GZ(3)                                          &
1305          -693.0D0*XY10*GZ(1))
1306210   Q(10)=Q(10)+0.00390625D0*F*                                       &
1307          (256.0D0*XY0*GZ(10)                                           &
1308          -5760.0D0*XY2*GZ(8)                                           &
1309          +20160.0D0*XY4*GZ(6)                                          &
1310          -16800.0D0*XY6*GZ(4)                                          &
1311          +3150.0D0*XY8*GZ(2)                                           &
1312          -63.0D0*XY10*GZ(0))
1313209   Q(9)=Q(9)+0.0078125D0*F*                                          &
1314          (128.0D0*XY0*GZ(9)                                            &
1315          -2304.0D0*XY2*GZ(7)                                           &
1316          +6048.0D0*XY4*GZ(5)                                           &
1317          -3360.0D0*XY6*GZ(3)                                           &
1318          +315.0D0*XY8*GZ(1))
1319208   Q(8)=Q(8)+0.0078125D0*F*                                          &
1320          (128.0D0*XY0*GZ(8)                                            &
1321          -1792.0D0*XY2*GZ(6)                                           &
1322          +3360.0D0*XY4*GZ(4)                                           &
1323          -1120.0D0*XY6*GZ(2)                                           &
1324          +35.0D0*XY8*GZ(0))
1325207   Q(7)=Q(7)+0.0625D0*F*                                             &
1326          (16.0D0*XY0*GZ(7)                                             &
1327          -168.0D0*XY2*GZ(5)                                            &
1328          +210.0D0*XY4*GZ(3)                                            &
1329          -35.0D0*XY6*GZ(1))
1330206   Q(6)=Q(6)+0.0625D0*F                                              &
1331          *(16.0D0*XY0*GZ(6)                                            &
1332           -120.0D0*XY2*GZ(4)                                           &
1333           +90.0D0*XY4*GZ(2)                                            &
1334           -5.0D0*XY6*GZ(0))
1335205   Q(5)=Q(5)+0.125D0*F                                               &
1336          *(8.0D0*GZ(5)*XY0                                             &
1337           -40.0D0*GZ(3)*XY2                                            &
1338           +15.0D0*GZ(1)*XY4)
1339204   Q(4)=Q(4)+0.125D0*F*(8.0D0*XY0*GZ(4)                              &
1340                       -24.0D0*XY2*GZ(2)                                &
1341                        +3.0D0*XY4*GZ(0))
1342203   Q(3)=Q(3)+F*(XY0*GZ(3)-1.5D0*XY2*GZ(1))
1343202   Q(2)=Q(2)+F*(XY0*GZ(2)-0.5D0*XY2*GZ(0))
1344201   Q(1)=Q(1)+F*XY0*GZ(1)
1345200   Q(0)=Q(0)+F*XY0*GZ(0)
1346
1347END SUBROUTINE ADDQL0
1348
1349!-----------------------------------------------------------------SHIFTZ
1350
1351SUBROUTINE shiftz(q1,l1,m1, q2,m2, z)
1352IMPLICIT NONE
1353
1354!-----------------------------------------------------
1355!     Copyright A J Stone University of Cambridge 1983
1356!     Modifications and interface to Cadpac, R D Amos
1357!     Version for Cadpac5 , R D Amos, June 1990
1358!-----------------------------------------------------
1359!  Shift those multipoles in Q1 with L1 <= n <= M1 to the origin to
1360!  which the multipoles Q2 are referred, and add the shifted values
1361!  to Q2.
1362!  Values are required in Q2 only up to n=M2.
1363!  Z gives the position of Q1 relative to an origin at Q2.
1364!  Qn(0) = sum(s) [ (n!/s!(n-s)!) * Qs(z) * z**(n-s) ]
1365
1366INTEGER, INTENT(IN) :: l1, m1, m2
1367REAL(dp), INTENT(IN) :: q1(0:20), z
1368REAL(dp), INTENT(INOUT) :: q2(0:20)
1369
1370REAL(dp) :: zs(0:20)
1371INTEGER :: i, n, s, s1, s2
1372
1373if (l1 .gt. m1) return
1374zs(0)=1.0d0
1375do i=1,m2
1376  zs(i)=z*zs(i-1)
1377end do
1378!  Charge on Q1
1379if (l1 .eq. 0) then
1380  q2(0)=q2(0)+q1(0)
1381  do n=1,m2
1382    q2(n)=q2(n)+q1(0)*zs(n)
1383  end do
1384end if
1385if (m1 .le. 0) return
1386s1=max0(1,l1)
1387s2=min0(m1,m2)
1388do s=s1,s2
1389  q2(s)=q2(s)+q1(s)
1390  do n=s+1,m2
1391    q2(n)=q2(n)+binom(n,s)*q1(s)*zs(n-s)
1392  end do
1393end do
1394
1395END SUBROUTINE shiftz
1396
1397!----------------------------------------------------------------- MOVEZ
1398
1399SUBROUTINE movez (qp, p, iw)
1400IMPLICIT NONE
1401!-----------------------------------------------------
1402!     Copyright A J Stone University of Cambridge 1983
1403!     Modifications and interface to Cadpac, R D Amos
1404!     Version for Cadpac5 , R D Amos, June 1990
1405!-----------------------------------------------------
1406!  Move the multipole contributions in QP, which are referred to z=P,
1407!  to the nearest site.
1408REAL(dp) :: qp(0:), p
1409INTEGER, INTENT(IN) :: iw
1410
1411REAL(dp) :: r(maxs)
1412REAL(dp), PARAMETER :: eps=1d-8
1413INTEGER :: i, j, k, l, n, M(2), low
1414
1415!  J is one of the sites with the largest value of LIMIT.
1416J=1
1417do i=1,ns
1418  r(i)=dabs(xs(3,i)-p)/radius(i)
1419  if (limit(i) .gt. limit(j)) j=i
1420end do
1421!  LOW is the lowest rank of multipole to be moved at this stage
1422low=0
1423do
1424  k=j
1425  do i=1,ns
1426    if (r(i) .lt. r(k) .and. limit(i) .ge. low) k=i
1427  end do
1428  n=1
1429  m(1)=k
1430  do i=1,ns
1431    if (r(i) .gt. r(k)+eps .or. i .eq. k .or.                         &
1432        limit(i) .lt. low .or. limit(i) .ne. limit(k)) cycle
1433    n=2
1434    m(2)=i
1435  end do
1436!  Multipoles of ranks LOW to LIMIT(K) are to be moved at this stage
1437  IF (IW .GT. 0) WRITE (6,1001) P, LOW, LIMIT(K),                   &
1438      (M(I), XS(3,M(I)), I=1,N)
14391001  FORMAT (' From', F7.3, ': ranks', I3, ' to', I3,                  &
1440          ' to be moved to site ', I1, ' at', F7.3:                     &
1441          ' and site', I2, ' at', F7.3)
1442  if (n .eq. 2) then
1443    do i=low,limit(k)
1444      qp(i)=0.5d0*qp(i)
1445    end do
1446  end if
1447  do i=1,n
1448    k=m(i)
1449    call shiftz(qp,low,limit(k), q(0:,k),lmax, p-xs(3,k))
1450  end do
1451  do i=low,limit(k)
1452    qp(i)=0.0d0
1453  end do
1454!  At this point the new sites carry multipoles of all ranks up to
1455!  LMAX.  Shift any of ranks higher than LIMIT(K) back to the original
1456!  origin.  Note that following this process QP carries multipoles of
1457!  all ranks from LIMIT(K)+1 to LMAX.
1458  if (limit(k) .ge. lmax) return
1459  do i=1,n
1460    k=m(i)
1461    call shiftz(q(0:,k),limit(k)+1,lmax, qp,lmax, xs(3,k)-p)
1462    do l=limit(k)+1,lmax
1463      q(l,k)=0.0d0
1464    end do
1465  end do
1466  low=limit(k)+1
1467end do
1468END SUBROUTINE movez
1469
1470!------------------------------------------------------------------------
1471
1472REAL(dp) FUNCTION derf(x)
1473IMPLICIT NONE
1474
1475REAL(dp), INTENT(IN) :: x
1476!  Error function
1477REAL(dp) :: c(18) =                                                    &
1478    (/1.9449071068178803d0,4.20186582324414d-2,-1.86866103976769d-2,   &
1479    5.1281061839107d-3,-1.0683107461726d-3,1.744737872522d-4,          &
1480    -2.15642065714d-5,1.7282657974d-6,-2.00479241d-8,                  &
1481    -1.64782105d-8,2.0008475d-9,2.57716d-11,-3.06343d-11,              &
1482    1.9158d-12,3.703d-13,-5.43d-14,-4.0d-15,1.2d-15/)
1483REAL(dp) :: d(17) =                                                    &
1484    (/1.4831105640848036d0,-3.010710733865950d-1,6.89948306898316d-2,  &
1485    -1.39162712647222d-2,2.4207995224335d-3,-3.658639685849d-4,        &
1486    4.86209844323d-5,-5.7492565580d-6,6.113243578d-7,                  &
1487    -5.89910153d-8,5.2070091d-9,-4.232976d-10,3.18811d-11,             &
1488    -2.2361d-12,1.467d-13,-9.0d-15,5.0d-16/)
1489INTEGER ::  ncfc=18, ncfd=17
1490REAL(dp) :: xup=6.25d0,sqrtpi=1.7724538509055160d0
1491REAL(dp), PARAMETER :: zero=0.0d0, one=1.0d0, two=2.0d0,               &
1492    three=3.0d0, twenty=20.0d0, half = 0.5d0
1493
1494REAL(dp) :: bj, bjp1, bjp2, x2, xv
1495INTEGER :: j
1496
1497xv = dabs(x)
1498if (xv.ge.xup) then
1499  derf = dsign(one,x)
1500else if (xv.le.two) then
1501  x2 = x*x - two
1502  bjp2 = zero
1503  bjp1 = d(ncfd)
1504  j = ncfd - 1
1505  do
1506    bj = x2*bjp1 - bjp2 + d(j)
1507    if (j.eq.1) exit
1508    bjp2 = bjp1
1509    bjp1 = bj
1510    j = j - 1
1511  end do
1512  derf = half*(bj-bjp2)*x
1513else
1514  x2 = two - twenty/(xv+three)
1515  bjp2 = zero
1516  bjp1 = c(ncfc)
1517  j = ncfc - 1
1518  do
1519    bj = x2*bjp1 - bjp2 + c(j)
1520    if (j.eq.1) exit
1521    bjp2 = bjp1
1522    bjp1 = bj
1523    j = j - 1
1524  end do
1525  x2 = half*(bj-bjp2)/xv*dexp(-x*x)/sqrtpi
1526  derf = (one-x2)*dsign(one,x)
1527end IF
1528END FUNCTION derf
1529
1530!-----------------------------------------------------------------DMAERF
1531
1532SUBROUTINE dmaerf(aa, la,lb, za,zb, z1,z2, gz, skip)
1533!-----------------------------------------------------
1534!     Copyright A J Stone University of Cambridge 1983
1535!     Modifications and interface to Cadpac, R D Amos
1536!     Version for Cadpac5 , R D Amos, June 1990
1537!-----------------------------------------------------
1538!  C1  modified to remove the calculation of integrals of powers of x,
1539!      which can be done more generally and efficiently using the usual
1540!      numerical method.
1541
1542!  Returns in GZ(n,k,l) the integral (Z1,Z2) of
1543
1544!                 z**n (z-zA)**k (z-zB)**l exp(-AA*z**2).
1545IMPLICIT NONE
1546
1547REAL(dp), INTENT(IN) :: aa, za, zb, z1, z2
1548INTEGER, INTENT(IN) :: la, lb
1549REAL(dp), INTENT(OUT) :: gz(0:20,0:5,0:5)
1550LOGICAL :: skip
1551
1552REAL(dp) :: t, v, e1, e2, p1, p2
1553INTEGER :: k, l, n
1554
1555v=dsqrt(aa)
1556t=rtpi/v
1557
1558gz(0,0,0)=0.5d0*t*(derf(v*z2)-derf(v*z1))
1559skip=(dabs(gz(0,0,0)) .lt. 1.0d-8)
1560e1=dexp(-aa*z1**2)/(2d0*aa)
1561e2=dexp(-aa*z2**2)/(2d0*aa)
1562gz(1,0,0)=e1-e2
1563skip=skip .and. (dabs(gz(1,0,0)) .lt. 1.0d-8)
1564p1=e1
1565p2=e2
1566do n=2,16
1567  p1=p1*z1
1568  p2=p2*z2
1569  gz(n,0,0)=p1-p2+(n-1)*gz(n-2,0,0)/(2d0*aa)
1570  skip=skip .and. (dabs(gz(n,0,0)) .lt. 1.0d-8)
1571end do
1572if (skip) return
1573
1574do n=15,0,-1
1575  do l=1,min(lb,16-n)
1576    gz(n,0,l)=gz(n+1,0,l-1)-zb*gz(n,0,l-1)
1577  end do
1578  do k=1,min(la,16-n)
1579    gz(n,k,0)=gz(n+1,k-1,0)-za*gz(n,k-1,0)
1580    do l=1,min(lb,16-n-la)
1581      gz(n,k,l)=gz(n+1,k,l-1)-zb*gz(n,k,l-1)
1582    end do
1583  end do
1584end do
1585
1586END SUBROUTINE dmaerf
1587
1588!-----------------------------------------------------------------DMAQLM
1589
1590SUBROUTINE dmaqlm(densty,iw)
1591IMPLICIT NONE
1592REAL(dp), INTENT(IN) :: densty(*)
1593INTEGER, INTENT(IN) :: iw
1594
1595!-----------------------------------------------------
1596!     Copyright A J Stone University of Cambridge 1983
1597!     Modifications and interface to Cadpac, R D Amos
1598!     Version for Cadpac5 , R D Amos, June 1990
1599!-----------------------------------------------------
1600!  Calculate multipole moments, and shift them to the nearest site.
1601!  Normal routine, for use with non-linear molecules.
1602!  If IW>0, print details of the progress of the calculation.
1603!  If NUCLEI, include the nuclear charges in the calculation.
1604!  The multipoles Qlmc and Qlms are sqrt(2) times the real and
1605!  imaginary parts of the complex multipole [Ql,-m]*=(-1)**m Qlm,
1606!  except for m=0.
1607!  Qlm=<Rlm*p>, where p is the charge density operator and the Rlm
1608!  are
1609!           R00  = 1
1610!           R10  = z
1611!           R11c = x
1612!           R11s = y
1613!           R20  = (1/2)*(3*z**2-r**2)
1614!           R21c = sqrt(3)*x*z
1615!           R21s = sqrt(3)*y*z
1616!           R22c = sqrt(3/4)*(x**2-y**2)
1617!           R22s = sqrt(3)*x*y
1618!           etc.
1619!  The multipoles are stored in the order Q00, Q10, Q11c, Q11s, Q20, ...
1620!  The program calculates multipoles up to rank 6 for each pair of
1621!  primitives. This is enough to cope with s, p, d and f functions.
1622!  Multipoles up to rank LMAX are retained when shifting to a new
1623!  origin. The maximum value allowed for LMAX is currently 10.
1624!  The basis functions are:
1625!               1   2   3   4   5   6   7   8   9  10
1626!               s   px  py  pz dxx dyy dzz dxy dxz dyz
1627!               11  12  13  14  15  16  17  18  19  20
1628!               xxx yyy zzz xxy xxz xyy yyz xzz yzz xyz
1629!  Note that integrals involving dxy, dxz and dyz must be multiplied by
1630!  sqrt(3), because of the difference in normalization from dxx etc.
1631!  Similarly those involving the f functions xxy,xxz,xyy,yyz,xzz and yzz
1632!  must be multiplied by sqrt(5) and those involving xyz by sqrt(15).
1633
1634
1635REAL(dp) :: qt
1636COMMON/BIG/qt(121)
1637
1638!  L1=L+1, LL1=2L+1, where L is the maximum angular momentum of basis
1639!  function that can be handled, i.e. 4 at present.
1640INTEGER, PARAMETER :: L1=5, LL1=9
1641!  Dimension is (2L+1)*(L+1)**2, where L is the highest angular momentum
1642!  basis function
1643REAL(dp) :: gx(0:l1*l1*ll1), gy(0:l1*l1*ll1), gz(0:l1*l1*ll1)
1644REAL(dp) :: xai(0:5)=1d0, yai(0:5)=1d0, zai(0:5)=1d0,                  &
1645    xbj(0:5)=1d0, ybj(0:5)=1d0, zbj(0:5)=1d0
1646
1647LOGICAL :: ieqj, iieqjj, do_quadrature
1648
1649INTEGER :: i, i1, i2, ia, ib, ii, ii1, ii2, ig, iq,                    &
1650    j, j1, j2, jb, jj, jj1, jj2, jg, jgmax, k, k1, k2,                 &
1651    l, la, lb, loci, locj, lq,                                  &
1652    m, ma, mb, mx, my, mz, mini, maxi, minj, maxj, nq
1653REAL(dp) :: aa, ai, arri, aj, ci, cj, dum, e, fac, f, g,               &
1654    p, pax, pay, paz, pq, px, py, pz, rr, s, t, xi, xj, xa, xb,        &
1655    xji, xk, xp, xas, xbs, yi, yj, ya, yb, yji, yk, yp, yas, ybs,      &
1656    za, zas, zb, zbs, zk, zp, zi, zj, zji
1657
1658do_quadrature=.false.
1659
1660if (iw .gt. 0) write (iw,"(a/a)")                                      &
1661    '    Atoms   Shells Primitives            Position',               &
1662    '     Multipole contributions ...'
1663katom(nshell+1)=0
1664!  Loop over pairs of atoms
1665do i=1,nat
1666  xi=c(1,i)
1667  yi=c(2,i)
1668  zi=c(3,i)
1669  qt=0.0d0
1670  if (nuclei .and. i .ge. mindc .and. i .le. maxdc) then
1671    qt(1)=zan(i)
1672    call moveq (xi,yi,zi)
1673  endif
1674
1675  !  Find shells for atom i
1676  ii1=0
1677  ishells: do ii=1,nshell
1678    if (katom(ii) .eq. i) then
1679      ii1=ii
1680      do k=ii1,nshell+1
1681        if (katom(k) .ne. i) then
1682          ii2=k-1
1683          exit ishells
1684        end if
1685      end do
1686    end if
1687  end do ishells
1688  if (ii1 .eq. 0) cycle  !  No basis functions on atom I
1689
1690  !  Loop over shells for atom i
1691  do ii=ii1,ii2
1692    i1=kstart(ii)
1693    i2=i1+kng(ii)-1
1694    la=ktype(ii)-1
1695    mini=kmin(ii)
1696    maxi=kmax(ii)
1697    loci=kloc(ii)-mini
1698
1699    !  Loop over atoms j
1700    do j=1,i
1701      ieqj=i .eq. j
1702      xj=c(1,j)
1703      yj=c(2,j)
1704      zj=c(3,j)
1705      xji=xi-xj
1706      yji=yi-yj
1707      zji=zi-zj
1708      rr=xji**2+yji**2+zji**2
1709
1710      !  Find shells for atom j
1711      jj1=0
1712      jshells: do jj=1,nshell
1713        if (katom(jj) .eq. j) then
1714          jj1=jj
1715          do k=jj1,nshell+1
1716            if (katom(k) .ne. j) then
1717              jj2=k-1
1718              exit jshells
1719            end if
1720          end do
1721        end if
1722      end do jshells
1723      if (jj1 .eq. 0) cycle  !  No basis functions on atom j
1724
1725      !  Loop over shells for atom j
1726      if (ieqj) jj2=ii
1727      do jj=jj1,jj2
1728        j1=kstart(jj)
1729        j2=j1+kng(jj)-1
1730        lb=ktype(jj)-1
1731        minj=kmin(jj)
1732        maxj=kmax(jj)
1733        locj=kloc(jj)-minj
1734        iieqjj=ii.eq.jj
1735
1736        !  Set up temporary density matrix for this pair of shells
1737        do ib=mini,maxi
1738          m=iax(loci+ib)
1739          if (iieqjj) then
1740            do jb=minj,ib
1741              d(ib,jb)=densty(m+locj+jb)
1742              d(jb,ib)=densty(m+locj+jb)
1743            end do
1744          else
1745            do jb=minj,maxj
1746              d(ib,jb)=densty(m+locj+jb)
1747            end do
1748          end if
1749        end do
1750        !  Insert factors of sqrt(3) for xy, xz and yz functions, if present,
1751        !  and factors of sqrt(5) and sqrt(15) for f functions. This is to
1752        !  compensate for the use of the same normalisation factor in all the
1753        !  d integrals and in all the f integrals.
1754        select case(la)
1755        case(2)
1756          d(8:10,minj:maxj)=rt(3)*d(8:10,minj:maxj)
1757        case(3)
1758          d(14:19,minj:maxj)=rt(5)*d(14:19,minj:maxj)
1759          d(20,minj:maxj)=rt(15)*d(20,minj:maxj)
1760        case(4)
1761          d(24:29,minj:maxj)=rt(7)*d(24:29,minj:maxj)
1762          d(30:32,minj:maxj)=(rt(5)*rt(7)/rt(3))*d(30:32,minj:maxj)
1763          d(33:35,minj:maxj)=rt(5)*rt(7)*d(33:35,minj:maxj)
1764        end select
1765        select case(lb)
1766        case(2)
1767          d(mini:maxi,8:10)=rt(3)*d(mini:maxi,8:10)
1768        case(3)
1769          d(mini:maxi,14:19)=rt(5)*d(mini:maxi,14:19)
1770          d(mini:maxi,20)=rt(15)*d(mini:maxi,20)
1771        case(4)
1772          d(mini:maxi,24:29)=rt(7)*d(mini:maxi,24:29)
1773          d(mini:maxi,30:32)=(rt(5)*rt(7)/rt(3))*d(mini:maxi,30:32)
1774          d(mini:maxi,33:35)=rt(5)*rt(7)*d(mini:maxi,33:35)
1775        end select
1776
1777        !  I primitive
1778        jgmax=j2
1779        do ig=i1,i2
1780          ai=ex(ig)
1781          arri=ai*rr
1782          !  J primitive
1783          if (iieqjj) jgmax=ig
1784          do jg=j1,jgmax
1785            aj=ex(jg)
1786            aa=ai+aj
1787            dum=aj*arri/aa
1788            if (dum.gt.tol) cycle
1789            fac=dexp(-dum)
1790!  Introduce factor of 2 if (a) shells are different (II.NE.JJ) because
1791!  loops over atoms and shells count each pair only once, and (b) if
1792!  II.EQ.JJ but IG.NE.JG, because loops over primitives count each pair
1793!  only once.  In fact IG.NE.JG covers both cases.  However, different
1794!  atoms may use the same shells and primitives if there is symmetry, and
1795!  there is always a factor of 2 if the atoms are different.
1796            if (ig .ne. jg .or. .not. ieqj) fac=2.0d0*fac
1797
1798            if (ex(ig)+ex(jg) > bigexp) then
1799!  At least one primitive with large exponent.
1800!           if (ieqj .and. ex(ig)+ex(jg) > bigexp) then
1801!  Both primitives on the same atom, at least one with large exponent.
1802!  Use original DMA algorithm.
1803
1804!  Vectors A and B are the positions of atoms I and J relative to the
1805!  centre P of the overlap distribution.
1806            p=aj/aa
1807            xa=p*xji
1808            ya=p*yji
1809            za=p*zji
1810            xb=xa-xji
1811            yb=ya-yji
1812            zb=za-zji
1813            xp=xi-xa
1814            yp=yi-ya
1815            zp=zi-za
1816            t=dsqrt(1.0d0/aa)
1817            if (iw .gt. 0) write (iw,"(3(i5,i4), 3x, 3f10.5)")      &
1818                i,j, ii,jj, ig,jg, xp,yp,zp
1819!  LQ is the maximum rank of multipole to which these functions
1820!  contribute. The integrals involve polynomials up to order 2(NQ-1),
1821!  for which NQ integration points are required.
1822            lq=la+lb
1823            nq=lq+1
1824            k1=mink(nq)
1825            k2=maxk(nq)
1826            !  Clear integral arrays
1827            gx=0.0d0
1828            gy=0.0d0
1829            gz=0.0d0
1830
1831!  The following loop runs through the integration points, accumulating
1832!  in GX(LL1*L1*(IA-1)+L1*(IB-1)+IQ) the quantity
1833!       sum(k) gk * (xk-xA)**(IA-1) * (xk-xB)**(IB-1) * xk**(IQ-1)
1834!  where gk=w(k)/sqrt(AA) and xk=h(k)/sqrt(AA), and L1=L+1 and
1835!  LL1=2L+1, where L is the maximum angular momentum to be handled,
1836!  i.e. 3 at present.
1837!  Similar expressions for y and z integrals are formed in GY and GZ.
1838            do k=k1,k2
1839              s=h(k)*t
1840              g=w(k)*t
1841              xas=s-xa
1842              yas=s-ya
1843              zas=s-za
1844              xbs=s-xb
1845              ybs=s-yb
1846              zbs=s-zb
1847              ma=0
1848              pax=g
1849              pay=g
1850              paz=g
1851              do ia=0,la
1852                mb=ma
1853                px=pax
1854                py=pay
1855                pz=paz
1856                do ib=0,lb
1857                  pq=1.0d0
1858                  do iq=1,nq
1859                    gx(mb+iq)=gx(mb+iq)+px*pq
1860                    gy(mb+iq)=gy(mb+iq)+py*pq
1861                    gz(mb+iq)=gz(mb+iq)+pz*pq
1862                    pq=pq*s
1863                  end do
1864                  mb=mb+ll1
1865                  px=px*xbs
1866                  py=py*ybs
1867                  pz=pz*zbs
1868                end do
1869                ma=ma+l1*ll1
1870                pax=pax*xas
1871                pay=pay*yas
1872                paz=paz*zas
1873              end do
1874            end do
1875!  Now these basic integrals are used to construct the multipole moments
1876!  for the overlap density corresponding to each pair of basis functions
1877!  in the pair of shells.
1878            qt=0.0d0
1879            ci=cs(ig)
1880            do ia=mini,maxi
1881              if (ia .gt. 1 .and. la .eq. 1) ci=cp(ig)
1882              ! if (ia .gt. 4) ci=cd(ig)
1883              cj=cs(jg)
1884              do jb=minj,maxj
1885                if (jb .gt. 1 .and. lb .eq. 1) cj=cp(jg)
1886                ! if (jb .gt. 4) cj=cd(jg)
1887                f=-fac*ci*cj*d(ia,jb)
1888                mx=(ix(ia)*l1+ix(jb))*ll1+1
1889                my=(iy(ia)*l1+iy(jb))*ll1+1
1890                mz=(iz(ia)*l1+iz(jb))*ll1+1
1891!  Now the integral of (x**i)*(y**j)*(z**k) over the current pair of
1892!  atomic primitive orbitals is F*GX(MX+i)*GY(MY+j)*GZ(MZ+k).
1893                call addqlm(lq, f, gx(mx:),gy(my:),gz(mz:))
1894!  End of loop over basis functions
1895              end do
1896            end do
1897
1898            if (iw .gt. 0) write (iw,1003) qt(1:nq**2)
18991003        format (f10.6: / 3f10.6: / 5f10.6: / 7f10.6: / 9f10.6: /   &
1900                11f10.6: / 13f10.6: / 15f10.6: / 17f10.6: / 19f10.6: / &
1901                21f10.6)
1902!  Move multipoles to expansion centre nearest to overlap centre P.
1903            call moveq(xp,yp,zp)
1904
1905            else
1906!  General case. Use integration over grid to assign multipole moments
1907!  to atoms.
1908              if (.not. do_quadrature) then
1909                !  Clear grid of density values
1910                rho(:)=0d0
1911                do_quadrature=.true.
1912              end if
1913
1914!  P is the overlap centre
1915              p=aj/aa
1916              xp=xi-p*xji
1917              yp=yi-p*yji
1918              zp=zi-p*zji
1919              if (iw > 0) write(iw, "(2i5, 3f20.15)") ig, jg, xp, yp, zp
1920              do k=1,ng
1921                xk=grid(1,k)
1922                yk=grid(2,k)
1923                zk=grid(3,k)
1924                xa=xk-xi
1925                ya=yk-yi
1926                za=zk-zi
1927                xb=xk-xj
1928                yb=yk-yj
1929                zb=zk-zj
1930                e=aa*((xk-xp)**2+(yk-yp)**2+(zk-zp)**2)
1931                if (e > etol) cycle
1932                e=exp(-e)
1933                ci=cs(ig)
1934                do l=1,la
1935                  xai(l)=xa*xai(l-1)
1936                  yai(l)=ya*yai(l-1)
1937                  zai(l)=za*zai(l-1)
1938                end do
1939                do ia=mini,maxi
1940                  if (ia .gt. 1 .and. la .eq. 1) ci=cp(ig)
1941                  ! if (ia .gt. 4) ci=cd(ig)
1942                  cj=cs(jg)
1943                  do l=1,lb
1944                    xbj(l)=xb*xbj(l-1)
1945                    ybj(l)=yb*ybj(l-1)
1946                    zbj(l)=zb*zbj(l-1)
1947                  end do
1948                  do jb=minj,maxj
1949                    if (jb .gt. 1 .and. lb .eq. 1) cj=cp(jg)
1950                    ! if (jb .gt. 4) cj=cd(jg)
1951                    f=-fac*ci*cj*d(ia,jb)
1952                    ! print "(4i5)", k, ia, jb
1953                    rho(k)=rho(k)+e*f*                                 &
1954                        xai(ix(ia))*yai(iy(ia))*zai(iz(ia))*           &
1955                        xbj(ix(jb))*ybj(iy(jb))*zbj(iz(jb))
1956                  end do
1957                end do
1958              end do
1959
1960!  Now we have added in the overlap charge density for this pair of
1961!  primitives
1962
1963            end if
1964            !  End of loop over primitives
1965          end do
1966        end do
1967
1968        !  End of loop over shells for atom j
1969      end do
1970      !  End of loop over atoms j
1971    end do
1972    !  End of loop over shells for atom i
1973  end do
1974  !  End of loop over atoms i
1975end do
1976
1977if (do_quadrature) then
1978  !  Loop over sites to evaluate multipole contributions from charge density
1979  gx(0)=1d0
1980  gy(0)=1d0
1981  gz(0)=1d0
1982  do i=1,ns
1983    xi=xs(1,i)
1984    yi=xs(2,i)
1985    zi=xs(3,i)
1986    qt=0d0
1987    !  Work backwards (most distant points first) to avoid loss of
1988    !  significance.
1989    do k=start(i+1)-1,start(i),-1
1990      ! print "(i6,f12.7)", k, rho(k)
1991      xk=grid(1,k)-xi
1992      yk=grid(2,k)-yi
1993      zk=grid(3,k)-zi
1994      do l=1,lmax
1995        gx(l)=gx(l-1)*xk
1996        gy(l)=gy(l-1)*yk
1997        gz(l)=gz(l-1)*zk
1998      end do
1999      call addqlm(lmax, grid(4,k)*rho(k), gx, gy, gz)
2000    end do
2001    call moveq(xi,yi,zi)
2002  end do
2003end if
2004
2005if (allocated(grid)) deallocate(grid)
2006if (allocated(start)) deallocate(start)
2007
2008END SUBROUTINE dmaqlm
2009
2010!-----------------------------------------------------------------ADDQLM
2011
2012SUBROUTINE addqlm(l, f, gx,gy,gz)
2013IMPLICIT NONE
2014REAL(dp), INTENT(IN) :: gx(0:), gy(0:), gz(0:), f
2015INTEGER, INTENT(IN) :: l
2016!-----------------------------------------------------
2017!     Copyright A J Stone University of Cambridge 1983
2018!     Modifications and interface to Cadpac, R D Amos
2019!     Version for Cadpac5 , R D Amos, June 1990
2020!-----------------------------------------------------
2021
2022REAL(dp) :: Q00, Q10,Q11c,Q11s, Q20,Q21c,Q21s,Q22c,Q22s,               &
2023    Q30,Q31c,Q31s,Q32c,Q32s,Q33c,Q33s,                                 &
2024    Q40,Q41c,Q41s,Q42c,Q42s,Q43c,Q43s,Q44c,Q44s,                       &
2025    Q50,Q51c,Q51s,Q52c,Q52s,Q53c,Q53s,Q54c,Q54s,Q55c,Q55s,             &
2026    Q60,Q61c,Q61s,Q62c,Q62s,Q63c,Q63s,Q64c,Q64s,Q65c,Q65s,Q66c,Q66s,   &
2027    Q70,Q71c,Q71s,Q72c,Q72s,Q73c,Q73s,Q74c,Q74s,Q75c,Q75s,Q76c,Q76s,   &
2028    Q77c,Q77s,                                                         &
2029    Q80,Q81c,Q81s,Q82c,Q82s,Q83c,Q83s,Q84c,Q84s,Q85c,Q85s,Q86c,Q86s,   &
2030    Q87c,Q87s,Q88c,Q88s,                                               &
2031    Q90,Q91c,Q91s,Q92c,Q92s,Q93c,Q93s,Q94c,Q94s,Q95c,Q95s,Q96c,Q96s,   &
2032    Q97c,Q97s,Q98c,Q98s,Q99c,Q99s,                                     &
2033    QA0,QA1c,QA1s,QA2c,QA2s,QA3c,QA3s,QA4c,QA4s,QA5c,QA5s,QA6c,QA6s,   &
2034    QA7c,QA7s,QA8c,QA8s,QA9c,QA9s,QAAc,QAAs
2035
2036COMMON/BIG/Q00, Q10,Q11c,Q11s, Q20,Q21c,Q21s,Q22c,Q22s,                &
2037    Q30,Q31c,Q31s,Q32c,Q32s,Q33c,Q33s,                                 &
2038    Q40,Q41c,Q41s,Q42c,Q42s,Q43c,Q43s,Q44c,Q44s,                       &
2039    Q50,Q51c,Q51s,Q52c,Q52s,Q53c,Q53s,Q54c,Q54s,Q55c,Q55s,             &
2040    Q60,Q61c,Q61s,Q62c,Q62s,Q63c,Q63s,Q64c,Q64s,Q65c,Q65s,Q66c,Q66s,   &
2041    Q70,Q71c,Q71s,Q72c,Q72s,Q73c,Q73s,Q74c,Q74s,Q75c,Q75s,Q76c,Q76s,   &
2042    Q77c,Q77s,                                                         &
2043    Q80,Q81c,Q81s,Q82c,Q82s,Q83c,Q83s,Q84c,Q84s,Q85c,Q85s,Q86c,Q86s,   &
2044    Q87c,Q87s,Q88c,Q88s,                                               &
2045    Q90,Q91c,Q91s,Q92c,Q92s,Q93c,Q93s,Q94c,Q94s,Q95c,Q95s,Q96c,Q96s,   &
2046    Q97c,Q97s,Q98c,Q98s,Q99c,Q99s,                                     &
2047    QA0,QA1c,QA1s,QA2c,QA2s,QA3c,QA3s,QA4c,QA4s,QA5c,QA5s,QA6c,QA6s,   &
2048    QA7c,QA7s,QA8c,QA8s,QA9c,QA9s,QAAc,QAAs
2049
2050
2051go to (100,101,102,103,104,105,106,107,108,109,110), min(l,lmax)+1
2052110                                                                     &
2053QA0=QA0+f*(256d0*gx(0)*gy(0)*gz(10)-5760d0*gx(0)*gy(2)*gz(8)            &
2054    -5760d0*gx(2)*gy(0)*gz(8)+20160d0*gx(0)*gy(4)*gz(6)                 &
2055    +40320d0*gx(2)*gy(2)*gz(6)+20160d0*gx(4)*gy(0)*gz(6)                &
2056    -16800d0*gx(0)*gy(6)*gz(4)-50400d0*gx(2)*gy(4)*gz(4)                &
2057    -50400d0*gx(4)*gy(2)*gz(4)-16800d0*gx(6)*gy(0)*gz(4)                &
2058    +3150d0*gx(0)*gy(8)*gz(2)+12600d0*gx(2)*gy(6)*gz(2)                 &
2059    +18900d0*gx(4)*gy(4)*gz(2)+12600d0*gx(6)*gy(2)*gz(2)                &
2060    +3150d0*gx(8)*gy(0)*gz(2)-63d0*gx(0)*gy(10)*gz(0)                   &
2061    -315d0*gx(2)*gy(8)*gz(0)-630d0*gx(4)*gy(6)*gz(0)                    &
2062    -630d0*gx(6)*gy(4)*gz(0)-315d0*gx(8)*gy(2)*gz(0)                    &
2063    -63d0*gx(10)*gy(0)*gz(0))/256d0
2064QA1s=QA1s+f*rt(5)*rt(11)*(128d0*gx(0)*gy(1)*gz(9)                       &
2065    -1152d0*gx(0)*gy(3)*gz(7)-1152d0*gx(2)*gy(1)*gz(7)                  &
2066    +2016d0*gx(0)*gy(5)*gz(5)+4032d0*gx(2)*gy(3)*gz(5)                  &
2067    +2016d0*gx(4)*gy(1)*gz(5)-840d0*gx(0)*gy(7)*gz(3)                   &
2068    -2520d0*gx(2)*gy(5)*gz(3)-2520d0*gx(4)*gy(3)*gz(3)                  &
2069    -840d0*gx(6)*gy(1)*gz(3)+63d0*gx(0)*gy(9)*gz(1)                     &
2070    +252d0*gx(2)*gy(7)*gz(1)+378d0*gx(4)*gy(5)*gz(1)                    &
2071    +252d0*gx(6)*gy(3)*gz(1)+63d0*gx(8)*gy(1)*gz(1))/128d0
2072QA1c=QA1c+f*rt(5)*rt(11)*(128d0*gx(1)*gy(0)*gz(9)                       &
2073    -1152d0*gx(1)*gy(2)*gz(7)-1152d0*gx(3)*gy(0)*gz(7)                  &
2074    +2016d0*gx(1)*gy(4)*gz(5)+4032d0*gx(3)*gy(2)*gz(5)                  &
2075    +2016d0*gx(5)*gy(0)*gz(5)-840d0*gx(1)*gy(6)*gz(3)                   &
2076    -2520d0*gx(3)*gy(4)*gz(3)-2520d0*gx(5)*gy(2)*gz(3)                  &
2077    -840d0*gx(7)*gy(0)*gz(3)+63d0*gx(1)*gy(8)*gz(1)                     &
2078    +252d0*gx(3)*gy(6)*gz(1)+378d0*gx(5)*gy(4)*gz(1)                    &
2079    +252d0*gx(7)*gy(2)*gz(1)+63d0*gx(9)*gy(0)*gz(1))/128d0
2080QA2s=QA2s+f*rt(3)*rt(5)*rt(11)*(768d0*gx(1)*gy(1)*gz(8)                 &
2081    -3584d0*gx(1)*gy(3)*gz(6)-3584d0*gx(3)*gy(1)*gz(6)                  &
2082    +3360d0*gx(1)*gy(5)*gz(4)+6720d0*gx(3)*gy(3)*gz(4)                  &
2083    +3360d0*gx(5)*gy(1)*gz(4)-672d0*gx(1)*gy(7)*gz(2)                   &
2084    -2016d0*gx(3)*gy(5)*gz(2)-2016d0*gx(5)*gy(3)*gz(2)                  &
2085    -672d0*gx(7)*gy(1)*gz(2)+14d0*gx(1)*gy(9)*gz(0)                     &
2086    +56d0*gx(3)*gy(7)*gz(0)+84d0*gx(5)*gy(5)*gz(0)                      &
2087    +56d0*gx(7)*gy(3)*gz(0)+14d0*gx(9)*gy(1)*gz(0))/256d0
2088QA2c=QA2c+f*rt(3)*rt(5)*rt(11)*(-384d0*gx(0)*gy(2)*gz(8)                &
2089    +384d0*gx(2)*gy(0)*gz(8)+1792d0*gx(0)*gy(4)*gz(6)                   &
2090    -1792d0*gx(4)*gy(0)*gz(6)-1680d0*gx(0)*gy(6)*gz(4)                  &
2091    -1680d0*gx(2)*gy(4)*gz(4)+1680d0*gx(4)*gy(2)*gz(4)                  &
2092    +1680d0*gx(6)*gy(0)*gz(4)+336d0*gx(0)*gy(8)*gz(2)                   &
2093    +672d0*gx(2)*gy(6)*gz(2)-672d0*gx(6)*gy(2)*gz(2)                    &
2094    -336d0*gx(8)*gy(0)*gz(2)-7d0*gx(0)*gy(10)*gz(0)                     &
2095    -21d0*gx(2)*gy(8)*gz(0)-14d0*gx(4)*gy(6)*gz(0)                      &
2096    +14d0*gx(6)*gy(4)*gz(0)+21d0*gx(8)*gy(2)*gz(0)                      &
2097    +7d0*gx(10)*gy(0)*gz(0))/256d0
2098QA3s=QA3s+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*(-64d0*gx(0)*gy(3)*gz(7)    &
2099    +192d0*gx(2)*gy(1)*gz(7)+168d0*gx(0)*gy(5)*gz(5)                    &
2100    -336d0*gx(2)*gy(3)*gz(5)-504d0*gx(4)*gy(1)*gz(5)                    &
2101    -84d0*gx(0)*gy(7)*gz(3)+84d0*gx(2)*gy(5)*gz(3)                      &
2102    +420d0*gx(4)*gy(3)*gz(3)+252d0*gx(6)*gy(1)*gz(3)                    &
2103    +7d0*gx(0)*gy(9)*gz(1)-42d0*gx(4)*gy(5)*gz(1)                       &
2104    -56d0*gx(6)*gy(3)*gz(1)-21d0*gx(8)*gy(1)*gz(1))/128d0
2105QA3c=QA3c+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*(-192d0*gx(1)*gy(2)*gz(7)   &
2106    +64d0*gx(3)*gy(0)*gz(7)+504d0*gx(1)*gy(4)*gz(5)                     &
2107    +336d0*gx(3)*gy(2)*gz(5)-168d0*gx(5)*gy(0)*gz(5)                    &
2108    -252d0*gx(1)*gy(6)*gz(3)-420d0*gx(3)*gy(4)*gz(3)                    &
2109    -84d0*gx(5)*gy(2)*gz(3)+84d0*gx(7)*gy(0)*gz(3)                      &
2110    +21d0*gx(1)*gy(8)*gz(1)+56d0*gx(3)*gy(6)*gz(1)                      &
2111    +42d0*gx(5)*gy(4)*gz(1)-7d0*gx(9)*gy(0)*gz(1))/128d0
2112QA4s=QA4s+f*rt(3)*rt(5)*rt(11)*rt(13)*(-448d0*gx(1)*gy(3)*gz(6)         &
2113    +448d0*gx(3)*gy(1)*gz(6)+672d0*gx(1)*gy(5)*gz(4)                    &
2114    -672d0*gx(5)*gy(1)*gz(4)-168d0*gx(1)*gy(7)*gz(2)                    &
2115    -168d0*gx(3)*gy(5)*gz(2)+168d0*gx(5)*gy(3)*gz(2)                    &
2116    +168d0*gx(7)*gy(1)*gz(2)+4d0*gx(1)*gy(9)*gz(0)                      &
2117    +8d0*gx(3)*gy(7)*gz(0)-8d0*gx(7)*gy(3)*gz(0)-4d0*gx(9)*gy(1)*gz(0)) &
2118    /128d0
2119QA4c=QA4c+f*rt(3)*rt(5)*rt(11)*rt(13)*(112d0*gx(0)*gy(4)*gz(6)          &
2120    -672d0*gx(2)*gy(2)*gz(6)+112d0*gx(4)*gy(0)*gz(6)                    &
2121    -168d0*gx(0)*gy(6)*gz(4)+840d0*gx(2)*gy(4)*gz(4)                    &
2122    +840d0*gx(4)*gy(2)*gz(4)-168d0*gx(6)*gy(0)*gz(4)                    &
2123    +42d0*gx(0)*gy(8)*gz(2)-168d0*gx(2)*gy(6)*gz(2)                     &
2124    -420d0*gx(4)*gy(4)*gz(2)-168d0*gx(6)*gy(2)*gz(2)                    &
2125    +42d0*gx(8)*gy(0)*gz(2)-gx(0)*gy(10)*gz(0)+3d0*gx(2)*gy(8)*gz(0)    &
2126    +14d0*gx(4)*gy(6)*gz(0)+14d0*gx(6)*gy(4)*gz(0)                      &
2127    +3d0*gx(8)*gy(2)*gz(0)-gx(10)*gy(0)*gz(0))/128d0
2128QA5s=QA5s+f*rt(2)*rt(3)*rt(11)*rt(13)*(168d0*gx(0)*gy(5)*gz(5)          &
2129    -1680d0*gx(2)*gy(3)*gz(5)+840d0*gx(4)*gy(1)*gz(5)                   &
2130    -140d0*gx(0)*gy(7)*gz(3)+1260d0*gx(2)*gy(5)*gz(3)                   &
2131    +700d0*gx(4)*gy(3)*gz(3)-700d0*gx(6)*gy(1)*gz(3)                    &
2132    +15d0*gx(0)*gy(9)*gz(1)-120d0*gx(2)*gy(7)*gz(1)                     &
2133    -210d0*gx(4)*gy(5)*gz(1)+75d0*gx(8)*gy(1)*gz(1))/128d0
2134QA5c=QA5c+f*rt(2)*rt(3)*rt(11)*rt(13)*(840d0*gx(1)*gy(4)*gz(5)          &
2135    -1680d0*gx(3)*gy(2)*gz(5)+168d0*gx(5)*gy(0)*gz(5)                   &
2136    -700d0*gx(1)*gy(6)*gz(3)+700d0*gx(3)*gy(4)*gz(3)                    &
2137    +1260d0*gx(5)*gy(2)*gz(3)-140d0*gx(7)*gy(0)*gz(3)                   &
2138    +75d0*gx(1)*gy(8)*gz(1)-210d0*gx(5)*gy(4)*gz(1)                     &
2139    -120d0*gx(7)*gy(2)*gz(1)+15d0*gx(9)*gy(0)*gz(1))/128d0
2140QA6s=QA6s+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*(1344d0*gx(1)*gy(5)*gz(4)   &
2141    -4480d0*gx(3)*gy(3)*gz(4)+1344d0*gx(5)*gy(1)*gz(4)                  &
2142    -576d0*gx(1)*gy(7)*gz(2)+1344d0*gx(3)*gy(5)*gz(2)                   &
2143    +1344d0*gx(5)*gy(3)*gz(2)-576d0*gx(7)*gy(1)*gz(2)                   &
2144    +18d0*gx(1)*gy(9)*gz(0)-24d0*gx(3)*gy(7)*gz(0)                      &
2145    -84d0*gx(5)*gy(5)*gz(0)-24d0*gx(7)*gy(3)*gz(0)                      &
2146    +18d0*gx(9)*gy(1)*gz(0))/512d0
2147QA6c=QA6c+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*(-224d0*gx(0)*gy(6)*gz(4)   &
2148    +3360d0*gx(2)*gy(4)*gz(4)-3360d0*gx(4)*gy(2)*gz(4)                  &
2149    +224d0*gx(6)*gy(0)*gz(4)+96d0*gx(0)*gy(8)*gz(2)                     &
2150    -1344d0*gx(2)*gy(6)*gz(2)+1344d0*gx(6)*gy(2)*gz(2)                  &
2151    -96d0*gx(8)*gy(0)*gz(2)-3d0*gx(0)*gy(10)*gz(0)                      &
2152    +39d0*gx(2)*gy(8)*gz(0)+42d0*gx(4)*gy(6)*gz(0)                      &
2153    -42d0*gx(6)*gy(4)*gz(0)-39d0*gx(8)*gy(2)*gz(0)                      &
2154    +3d0*gx(10)*gy(0)*gz(0))/512d0
2155QA7s=QA7s+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*rt(17)*(                    &
2156    -16d0*gx(0)*gy(7)*gz(3)+336d0*gx(2)*gy(5)*gz(3)                     &
2157    -560d0*gx(4)*gy(3)*gz(3)+112d0*gx(6)*gy(1)*gz(3)                    &
2158    +3d0*gx(0)*gy(9)*gz(1)-60d0*gx(2)*gy(7)*gz(1)                       &
2159    +42d0*gx(4)*gy(5)*gz(1)+84d0*gx(6)*gy(3)*gz(1)                      &
2160    -21d0*gx(8)*gy(1)*gz(1))/256d0
2161QA7c=QA7c+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*rt(17)*(                    &
2162    -112d0*gx(1)*gy(6)*gz(3)+560d0*gx(3)*gy(4)*gz(3)                    &
2163    -336d0*gx(5)*gy(2)*gz(3)+16d0*gx(7)*gy(0)*gz(3)                     &
2164    +21d0*gx(1)*gy(8)*gz(1)-84d0*gx(3)*gy(6)*gz(1)                      &
2165    -42d0*gx(5)*gy(4)*gz(1)+60d0*gx(7)*gy(2)*gz(1)                      &
2166    -3d0*gx(9)*gy(0)*gz(1))/256d0
2167QA8s=QA8s+f*rt(5)*rt(11)*rt(13)*rt(17)*(-144d0*gx(1)*gy(7)*gz(2)        &
2168    +1008d0*gx(3)*gy(5)*gz(2)-1008d0*gx(5)*gy(3)*gz(2)                  &
2169    +144d0*gx(7)*gy(1)*gz(2)+8d0*gx(1)*gy(9)*gz(0)                      &
2170    -48d0*gx(3)*gy(7)*gz(0)+48d0*gx(7)*gy(3)*gz(0)                      &
2171    -8d0*gx(9)*gy(1)*gz(0))/256d0
2172QA8c=QA8c+f*rt(5)*rt(11)*rt(13)*rt(17)*(18d0*gx(0)*gy(8)*gz(2)          &
2173    -504d0*gx(2)*gy(6)*gz(2)+1260d0*gx(4)*gy(4)*gz(2)                   &
2174    -504d0*gx(6)*gy(2)*gz(2)+18d0*gx(8)*gy(0)*gz(2)-gx(0)*gy(10)*gz(0)  &
2175    +27d0*gx(2)*gy(8)*gz(0)-42d0*gx(4)*gy(6)*gz(0)                      &
2176    -42d0*gx(6)*gy(4)*gz(0)+27d0*gx(8)*gy(2)*gz(0)-gx(10)*gy(0)*gz(0))  &
2177    /256d0
2178QA9s=QA9s+f*rt(2)*rt(5)*rt(11)*rt(13)*rt(17)*rt(19)*(gx(0)*gy(9)*gz(1)  &
2179    -36d0*gx(2)*gy(7)*gz(1)+126d0*gx(4)*gy(5)*gz(1)                     &
2180    -84d0*gx(6)*gy(3)*gz(1)+9d0*gx(8)*gy(1)*gz(1))/256d0
2181QA9c=QA9c+f*rt(2)*rt(5)*rt(11)*rt(13)*rt(17)*rt(19)*(                   &
2182    9d0*gx(1)*gy(8)*gz(1)-84d0*gx(3)*gy(6)*gz(1)                        &
2183    +126d0*gx(5)*gy(4)*gz(1)-36d0*gx(7)*gy(2)*gz(1)+gx(9)*gy(0)*gz(1))  &
2184    /256d0
2185QAAs=QAAs+f*rt(2)*rt(11)*rt(13)*rt(17)*rt(19)*(10d0*gx(1)*gy(9)*gz(0)   &
2186    -120d0*gx(3)*gy(7)*gz(0)+252d0*gx(5)*gy(5)*gz(0)                    &
2187    -120d0*gx(7)*gy(3)*gz(0)+10d0*gx(9)*gy(1)*gz(0))/512d0
2188QAAc=QAAc+f*rt(2)*rt(11)*rt(13)*rt(17)*rt(19)*(-gx(0)*gy(10)*gz(0)      &
2189    +45d0*gx(2)*gy(8)*gz(0)-210d0*gx(4)*gy(6)*gz(0)                     &
2190    +210d0*gx(6)*gy(4)*gz(0)-45d0*gx(8)*gy(2)*gz(0)+gx(10)*gy(0)*gz(0)) &
2191    /512d0
2192
2193109                                                                     &
2194Q90=Q90+f*(128d0*gx(0)*gy(0)*gz(9)-2304d0*gx(0)*gy(2)*gz(7)             &
2195    -2304d0*gx(2)*gy(0)*gz(7)+6048d0*gx(0)*gy(4)*gz(5)                  &
2196    +12096d0*gx(2)*gy(2)*gz(5)+6048d0*gx(4)*gy(0)*gz(5)                 &
2197    -3360d0*gx(0)*gy(6)*gz(3)-10080d0*gx(2)*gy(4)*gz(3)                 &
2198    -10080d0*gx(4)*gy(2)*gz(3)-3360d0*gx(6)*gy(0)*gz(3)                 &
2199    +315d0*gx(0)*gy(8)*gz(1)+1260d0*gx(2)*gy(6)*gz(1)                   &
2200    +1890d0*gx(4)*gy(4)*gz(1)+1260d0*gx(6)*gy(2)*gz(1)                  &
2201    +315d0*gx(8)*gy(0)*gz(1))/128d0
2202Q91s=Q91s+f*rt(5)*(384d0*gx(0)*gy(1)*gz(8)-2688d0*gx(0)*gy(3)*gz(6)     &
2203    -2688d0*gx(2)*gy(1)*gz(6)+3360d0*gx(0)*gy(5)*gz(4)                  &
2204    +6720d0*gx(2)*gy(3)*gz(4)+3360d0*gx(4)*gy(1)*gz(4)                  &
2205    -840d0*gx(0)*gy(7)*gz(2)-2520d0*gx(2)*gy(5)*gz(2)                   &
2206    -2520d0*gx(4)*gy(3)*gz(2)-840d0*gx(6)*gy(1)*gz(2)                   &
2207    +21d0*gx(0)*gy(9)*gz(0)+84d0*gx(2)*gy(7)*gz(0)                      &
2208    +126d0*gx(4)*gy(5)*gz(0)+84d0*gx(6)*gy(3)*gz(0)                     &
2209    +21d0*gx(8)*gy(1)*gz(0))/128d0
2210Q91c=Q91c+f*rt(5)*(384d0*gx(1)*gy(0)*gz(8)-2688d0*gx(1)*gy(2)*gz(6)     &
2211    -2688d0*gx(3)*gy(0)*gz(6)+3360d0*gx(1)*gy(4)*gz(4)                  &
2212    +6720d0*gx(3)*gy(2)*gz(4)+3360d0*gx(5)*gy(0)*gz(4)                  &
2213    -840d0*gx(1)*gy(6)*gz(2)-2520d0*gx(3)*gy(4)*gz(2)                   &
2214    -2520d0*gx(5)*gy(2)*gz(2)-840d0*gx(7)*gy(0)*gz(2)                   &
2215    +21d0*gx(1)*gy(8)*gz(0)+84d0*gx(3)*gy(6)*gz(0)                      &
2216    +126d0*gx(5)*gy(4)*gz(0)+84d0*gx(7)*gy(2)*gz(0)                     &
2217    +21d0*gx(9)*gy(0)*gz(0))/128d0
2218Q92s=Q92s+f*rt(2)*rt(5)*rt(11)*(192d0*gx(1)*gy(1)*gz(7)                 &
2219    -672d0*gx(1)*gy(3)*gz(5)-672d0*gx(3)*gy(1)*gz(5)                    &
2220    +420d0*gx(1)*gy(5)*gz(3)+840d0*gx(3)*gy(3)*gz(3)                    &
2221    +420d0*gx(5)*gy(1)*gz(3)-42d0*gx(1)*gy(7)*gz(1)                     &
2222    -126d0*gx(3)*gy(5)*gz(1)-126d0*gx(5)*gy(3)*gz(1)                    &
2223    -42d0*gx(7)*gy(1)*gz(1))/64d0
2224Q92c=Q92c+f*rt(2)*rt(5)*rt(11)*(-96d0*gx(0)*gy(2)*gz(7)                 &
2225    +96d0*gx(2)*gy(0)*gz(7)+336d0*gx(0)*gy(4)*gz(5)                     &
2226    -336d0*gx(4)*gy(0)*gz(5)-210d0*gx(0)*gy(6)*gz(3)                    &
2227    -210d0*gx(2)*gy(4)*gz(3)+210d0*gx(4)*gy(2)*gz(3)                    &
2228    +210d0*gx(6)*gy(0)*gz(3)+21d0*gx(0)*gy(8)*gz(1)                     &
2229    +42d0*gx(2)*gy(6)*gz(1)-42d0*gx(6)*gy(2)*gz(1)                      &
2230    -21d0*gx(8)*gy(0)*gz(1))/64d0
2231Q93s=Q93s+f*rt(2)*rt(3)*rt(5)*rt(7)*rt(11)*(-64d0*gx(0)*gy(3)*gz(6)     &
2232    +192d0*gx(2)*gy(1)*gz(6)+120d0*gx(0)*gy(5)*gz(4)                    &
2233    -240d0*gx(2)*gy(3)*gz(4)-360d0*gx(4)*gy(1)*gz(4)                    &
2234    -36d0*gx(0)*gy(7)*gz(2)+36d0*gx(2)*gy(5)*gz(2)                      &
2235    +180d0*gx(4)*gy(3)*gz(2)+108d0*gx(6)*gy(1)*gz(2)+gx(0)*gy(9)*gz(0)  &
2236    -6d0*gx(4)*gy(5)*gz(0)-8d0*gx(6)*gy(3)*gz(0)-3d0*gx(8)*gy(1)*gz(0)) &
2237    /128d0
2238Q93c=Q93c+f*rt(2)*rt(3)*rt(5)*rt(7)*rt(11)*(-192d0*gx(1)*gy(2)*gz(6)    &
2239    +64d0*gx(3)*gy(0)*gz(6)+360d0*gx(1)*gy(4)*gz(4)                     &
2240    +240d0*gx(3)*gy(2)*gz(4)-120d0*gx(5)*gy(0)*gz(4)                    &
2241    -108d0*gx(1)*gy(6)*gz(2)-180d0*gx(3)*gy(4)*gz(2)                    &
2242    -36d0*gx(5)*gy(2)*gz(2)+36d0*gx(7)*gy(0)*gz(2)                      &
2243    +3d0*gx(1)*gy(8)*gz(0)+8d0*gx(3)*gy(6)*gz(0)+6d0*gx(5)*gy(4)*gz(0)  &
2244    -gx(9)*gy(0)*gz(0))/128d0
2245Q94s=Q94s+f*rt(5)*rt(7)*rt(11)*rt(13)*(-96d0*gx(1)*gy(3)*gz(5)          &
2246    +96d0*gx(3)*gy(1)*gz(5)+96d0*gx(1)*gy(5)*gz(3)                      &
2247    -96d0*gx(5)*gy(1)*gz(3)-12d0*gx(1)*gy(7)*gz(1)                      &
2248    -12d0*gx(3)*gy(5)*gz(1)+12d0*gx(5)*gy(3)*gz(1)                      &
2249    +12d0*gx(7)*gy(1)*gz(1))/64d0
2250Q94c=Q94c+f*rt(5)*rt(7)*rt(11)*rt(13)*(24d0*gx(0)*gy(4)*gz(5)           &
2251    -144d0*gx(2)*gy(2)*gz(5)+24d0*gx(4)*gy(0)*gz(5)                     &
2252    -24d0*gx(0)*gy(6)*gz(3)+120d0*gx(2)*gy(4)*gz(3)                     &
2253    +120d0*gx(4)*gy(2)*gz(3)-24d0*gx(6)*gy(0)*gz(3)                     &
2254    +3d0*gx(0)*gy(8)*gz(1)-12d0*gx(2)*gy(6)*gz(1)                       &
2255    -30d0*gx(4)*gy(4)*gz(1)-12d0*gx(6)*gy(2)*gz(1)                      &
2256    +3d0*gx(8)*gy(0)*gz(1))/64d0
2257Q95s=Q95s+f*rt(2)*rt(11)*rt(13)*(168d0*gx(0)*gy(5)*gz(4)                &
2258    -1680d0*gx(2)*gy(3)*gz(4)+840d0*gx(4)*gy(1)*gz(4)                   &
2259    -84d0*gx(0)*gy(7)*gz(2)+756d0*gx(2)*gy(5)*gz(2)                     &
2260    +420d0*gx(4)*gy(3)*gz(2)-420d0*gx(6)*gy(1)*gz(2)                    &
2261    +3d0*gx(0)*gy(9)*gz(0)-24d0*gx(2)*gy(7)*gz(0)                       &
2262    -42d0*gx(4)*gy(5)*gz(0)+15d0*gx(8)*gy(1)*gz(0))/128d0
2263Q95c=Q95c+f*rt(2)*rt(11)*rt(13)*(840d0*gx(1)*gy(4)*gz(4)                &
2264    -1680d0*gx(3)*gy(2)*gz(4)+168d0*gx(5)*gy(0)*gz(4)                   &
2265    -420d0*gx(1)*gy(6)*gz(2)+420d0*gx(3)*gy(4)*gz(2)                    &
2266    +756d0*gx(5)*gy(2)*gz(2)-84d0*gx(7)*gy(0)*gz(2)                     &
2267    +15d0*gx(1)*gy(8)*gz(0)-42d0*gx(5)*gy(4)*gz(0)                      &
2268    -24d0*gx(7)*gy(2)*gz(0)+3d0*gx(9)*gy(0)*gz(0))/128d0
2269Q96s=Q96s+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*(84d0*gx(1)*gy(5)*gz(3)     &
2270    -280d0*gx(3)*gy(3)*gz(3)+84d0*gx(5)*gy(1)*gz(3)                     &
2271    -18d0*gx(1)*gy(7)*gz(1)+42d0*gx(3)*gy(5)*gz(1)                      &
2272    +42d0*gx(5)*gy(3)*gz(1)-18d0*gx(7)*gy(1)*gz(1))/64d0
2273Q96c=Q96c+f*rt(2)*rt(3)*rt(5)*rt(11)*rt(13)*(-14d0*gx(0)*gy(6)*gz(3)    &
2274    +210d0*gx(2)*gy(4)*gz(3)-210d0*gx(4)*gy(2)*gz(3)                    &
2275    +14d0*gx(6)*gy(0)*gz(3)+3d0*gx(0)*gy(8)*gz(1)                       &
2276    -42d0*gx(2)*gy(6)*gz(1)+42d0*gx(6)*gy(2)*gz(1)                      &
2277    -3d0*gx(8)*gy(0)*gz(1))/64d0
2278Q97s=Q97s+f*rt(2)*rt(5)*rt(11)*rt(13)*(-48d0*gx(0)*gy(7)*gz(2)          &
2279    +1008d0*gx(2)*gy(5)*gz(2)-1680d0*gx(4)*gy(3)*gz(2)                  &
2280    +336d0*gx(6)*gy(1)*gz(2)+3d0*gx(0)*gy(9)*gz(0)                      &
2281    -60d0*gx(2)*gy(7)*gz(0)+42d0*gx(4)*gy(5)*gz(0)                      &
2282    +84d0*gx(6)*gy(3)*gz(0)-21d0*gx(8)*gy(1)*gz(0))/256d0
2283Q97c=Q97c+f*rt(2)*rt(5)*rt(11)*rt(13)*(-336d0*gx(1)*gy(6)*gz(2)         &
2284    +1680d0*gx(3)*gy(4)*gz(2)-1008d0*gx(5)*gy(2)*gz(2)                  &
2285    +48d0*gx(7)*gy(0)*gz(2)+21d0*gx(1)*gy(8)*gz(0)                      &
2286    -84d0*gx(3)*gy(6)*gz(0)-42d0*gx(5)*gy(4)*gz(0)                      &
2287    +60d0*gx(7)*gy(2)*gz(0)-3d0*gx(9)*gy(0)*gz(0))/256d0
2288Q98s=Q98s+f*rt(5)*rt(11)*rt(13)*rt(17)*(-24d0*gx(1)*gy(7)*gz(1)         &
2289    +168d0*gx(3)*gy(5)*gz(1)-168d0*gx(5)*gy(3)*gz(1)                    &
2290    +24d0*gx(7)*gy(1)*gz(1))/128d0
2291Q98c=Q98c+f*rt(5)*rt(11)*rt(13)*rt(17)*(3d0*gx(0)*gy(8)*gz(1)           &
2292    -84d0*gx(2)*gy(6)*gz(1)+210d0*gx(4)*gy(4)*gz(1)                     &
2293    -84d0*gx(6)*gy(2)*gz(1)+3d0*gx(8)*gy(0)*gz(1))/128d0
2294Q99s=Q99s+f*rt(2)*rt(5)*rt(11)*rt(13)*rt(17)*(gx(0)*gy(9)*gz(0)         &
2295    -36d0*gx(2)*gy(7)*gz(0)+126d0*gx(4)*gy(5)*gz(0)                     &
2296    -84d0*gx(6)*gy(3)*gz(0)+9d0*gx(8)*gy(1)*gz(0))/256d0
2297Q99c=Q99c+f*rt(2)*rt(5)*rt(11)*rt(13)*rt(17)*(9d0*gx(1)*gy(8)*gz(0)     &
2298    -84d0*gx(3)*gy(6)*gz(0)+126d0*gx(5)*gy(4)*gz(0)                     &
2299    -36d0*gx(7)*gy(2)*gz(0)+gx(9)*gy(0)*gz(0))/256d0
2300
2301108                                                                     &
2302Q80=Q80+f*(128d0*gx(0)*gy(0)*gz(8)-1792d0*gx(0)*gy(2)*gz(6)             &
2303    -1792d0*gx(2)*gy(0)*gz(6)+3360d0*gx(0)*gy(4)*gz(4)                  &
2304    +6720d0*gx(2)*gy(2)*gz(4)+3360d0*gx(4)*gy(0)*gz(4)                  &
2305    -1120d0*gx(0)*gy(6)*gz(2)-3360d0*gx(2)*gy(4)*gz(2)                  &
2306    -3360d0*gx(4)*gy(2)*gz(2)-1120d0*gx(6)*gy(0)*gz(2)                  &
2307    +35d0*gx(0)*gy(8)*gz(0)+140d0*gx(2)*gy(6)*gz(0)                     &
2308    +210d0*gx(4)*gy(4)*gz(0)+140d0*gx(6)*gy(2)*gz(0)                    &
2309    +35d0*gx(8)*gy(0)*gz(0))/128d0
2310Q81s=Q81s+f*(192d0*gx(0)*gy(1)*gz(7)-1008d0*gx(0)*gy(3)*gz(5)           &
2311    -1008d0*gx(2)*gy(1)*gz(5)+840d0*gx(0)*gy(5)*gz(3)                   &
2312    +1680d0*gx(2)*gy(3)*gz(3)+840d0*gx(4)*gy(1)*gz(3)                   &
2313    -105d0*gx(0)*gy(7)*gz(1)-315d0*gx(2)*gy(5)*gz(1)                    &
2314    -315d0*gx(4)*gy(3)*gz(1)-105d0*gx(6)*gy(1)*gz(1))/32d0
2315Q81c=Q81c+f*(192d0*gx(1)*gy(0)*gz(7)-1008d0*gx(1)*gy(2)*gz(5)           &
2316    -1008d0*gx(3)*gy(0)*gz(5)+840d0*gx(1)*gy(4)*gz(3)                   &
2317    +1680d0*gx(3)*gy(2)*gz(3)+840d0*gx(5)*gy(0)*gz(3)                   &
2318    -105d0*gx(1)*gy(6)*gz(1)-315d0*gx(3)*gy(4)*gz(1)                    &
2319    -315d0*gx(5)*gy(2)*gz(1)-105d0*gx(7)*gy(0)*gz(1))/32d0
2320Q82s=Q82s+f*rt(2)*rt(5)*rt(7)*(192d0*gx(1)*gy(1)*gz(6)                  &
2321    -480d0*gx(1)*gy(3)*gz(4)-480d0*gx(3)*gy(1)*gz(4)                    &
2322    +180d0*gx(1)*gy(5)*gz(2)+360d0*gx(3)*gy(3)*gz(2)                    &
2323    +180d0*gx(5)*gy(1)*gz(2)-6d0*gx(1)*gy(7)*gz(0)                      &
2324    -18d0*gx(3)*gy(5)*gz(0)-18d0*gx(5)*gy(3)*gz(0)                      &
2325    -6d0*gx(7)*gy(1)*gz(0))/64d0
2326Q82c=Q82c+f*rt(2)*rt(5)*rt(7)*(-96d0*gx(0)*gy(2)*gz(6)                  &
2327    +96d0*gx(2)*gy(0)*gz(6)+240d0*gx(0)*gy(4)*gz(4)                     &
2328    -240d0*gx(4)*gy(0)*gz(4)-90d0*gx(0)*gy(6)*gz(2)                     &
2329    -90d0*gx(2)*gy(4)*gz(2)+90d0*gx(4)*gy(2)*gz(2)                      &
2330    +90d0*gx(6)*gy(0)*gz(2)+3d0*gx(0)*gy(8)*gz(0)                       &
2331    +6d0*gx(2)*gy(6)*gz(0)-6d0*gx(6)*gy(2)*gz(0)-3d0*gx(8)*gy(0)*gz(0)) &
2332    /64d0
2333Q83s=Q83s+f*rt(3)*rt(5)*rt(7)*rt(11)*(-16d0*gx(0)*gy(3)*gz(5)           &
2334    +48d0*gx(2)*gy(1)*gz(5)+20d0*gx(0)*gy(5)*gz(3)                      &
2335    -40d0*gx(2)*gy(3)*gz(3)-60d0*gx(4)*gy(1)*gz(3)                      &
2336    -3d0*gx(0)*gy(7)*gz(1)+3d0*gx(2)*gy(5)*gz(1)                        &
2337    +15d0*gx(4)*gy(3)*gz(1)+9d0*gx(6)*gy(1)*gz(1))/32d0
2338Q83c=Q83c+f*rt(3)*rt(5)*rt(7)*rt(11)*(-48d0*gx(1)*gy(2)*gz(5)           &
2339    +16d0*gx(3)*gy(0)*gz(5)+60d0*gx(1)*gy(4)*gz(3)                      &
2340    +40d0*gx(3)*gy(2)*gz(3)-20d0*gx(5)*gy(0)*gz(3)                      &
2341    -9d0*gx(1)*gy(6)*gz(1)-15d0*gx(3)*gy(4)*gz(1)                       &
2342    -3d0*gx(5)*gy(2)*gz(1)+3d0*gx(7)*gy(0)*gz(1))/32d0
2343Q84s=Q84s+f*rt(7)*rt(11)*(-480d0*gx(1)*gy(3)*gz(4)                      &
2344    +480d0*gx(3)*gy(1)*gz(4)+288d0*gx(1)*gy(5)*gz(2)                    &
2345    -288d0*gx(5)*gy(1)*gz(2)-12d0*gx(1)*gy(7)*gz(0)                     &
2346    -12d0*gx(3)*gy(5)*gz(0)+12d0*gx(5)*gy(3)*gz(0)                      &
2347    +12d0*gx(7)*gy(1)*gz(0))/64d0
2348Q84c=Q84c+f*rt(7)*rt(11)*(120d0*gx(0)*gy(4)*gz(4)                       &
2349    -720d0*gx(2)*gy(2)*gz(4)+120d0*gx(4)*gy(0)*gz(4)                    &
2350    -72d0*gx(0)*gy(6)*gz(2)+360d0*gx(2)*gy(4)*gz(2)                     &
2351    +360d0*gx(4)*gy(2)*gz(2)-72d0*gx(6)*gy(0)*gz(2)                     &
2352    +3d0*gx(0)*gy(8)*gz(0)-12d0*gx(2)*gy(6)*gz(0)                       &
2353    -30d0*gx(4)*gy(4)*gz(0)-12d0*gx(6)*gy(2)*gz(0)                      &
2354    +3d0*gx(8)*gy(0)*gz(0))/64d0
2355Q85s=Q85s+f*rt(7)*rt(11)*rt(13)*(12d0*gx(0)*gy(5)*gz(3)                 &
2356    -120d0*gx(2)*gy(3)*gz(3)+60d0*gx(4)*gy(1)*gz(3)                     &
2357    -3d0*gx(0)*gy(7)*gz(1)+27d0*gx(2)*gy(5)*gz(1)                       &
2358    +15d0*gx(4)*gy(3)*gz(1)-15d0*gx(6)*gy(1)*gz(1))/32d0
2359Q85c=Q85c+f*rt(7)*rt(11)*rt(13)*(60d0*gx(1)*gy(4)*gz(3)                 &
2360    -120d0*gx(3)*gy(2)*gz(3)+12d0*gx(5)*gy(0)*gz(3)                     &
2361    -15d0*gx(1)*gy(6)*gz(1)+15d0*gx(3)*gy(4)*gz(1)                      &
2362    +27d0*gx(5)*gy(2)*gz(1)-3d0*gx(7)*gy(0)*gz(1))/32d0
2363Q86s=Q86s+f*rt(2)*rt(3)*rt(11)*rt(13)*(84d0*gx(1)*gy(5)*gz(2)           &
2364    -280d0*gx(3)*gy(3)*gz(2)+84d0*gx(5)*gy(1)*gz(2)                     &
2365    -6d0*gx(1)*gy(7)*gz(0)+14d0*gx(3)*gy(5)*gz(0)                       &
2366    +14d0*gx(5)*gy(3)*gz(0)-6d0*gx(7)*gy(1)*gz(0))/64d0
2367Q86c=Q86c+f*rt(2)*rt(3)*rt(11)*rt(13)*(-14d0*gx(0)*gy(6)*gz(2)          &
2368    +210d0*gx(2)*gy(4)*gz(2)-210d0*gx(4)*gy(2)*gz(2)                    &
2369    +14d0*gx(6)*gy(0)*gz(2)+gx(0)*gy(8)*gz(0)-14d0*gx(2)*gy(6)*gz(0)    &
2370    +14d0*gx(6)*gy(2)*gz(0)-gx(8)*gy(0)*gz(0))/64d0
2371Q87s=Q87s+f*rt(5)*rt(11)*rt(13)*(-3d0*gx(0)*gy(7)*gz(1)                 &
2372    +63d0*gx(2)*gy(5)*gz(1)-105d0*gx(4)*gy(3)*gz(1)                     &
2373    +21d0*gx(6)*gy(1)*gz(1))/32d0
2374Q87c=Q87c+f*rt(5)*rt(11)*rt(13)*(-21d0*gx(1)*gy(6)*gz(1)                &
2375    +105d0*gx(3)*gy(4)*gz(1)-63d0*gx(5)*gy(2)*gz(1)                     &
2376    +3d0*gx(7)*gy(0)*gz(1))/32d0
2377Q88s=Q88s+f*rt(5)*rt(11)*rt(13)*(-24d0*gx(1)*gy(7)*gz(0)                &
2378    +168d0*gx(3)*gy(5)*gz(0)-168d0*gx(5)*gy(3)*gz(0)                    &
2379    +24d0*gx(7)*gy(1)*gz(0))/128d0
2380Q88c=Q88c+f*rt(5)*rt(11)*rt(13)*(3d0*gx(0)*gy(8)*gz(0)                  &
2381    -84d0*gx(2)*gy(6)*gz(0)+210d0*gx(4)*gy(4)*gz(0)                     &
2382    -84d0*gx(6)*gy(2)*gz(0)+3d0*gx(8)*gy(0)*gz(0))/128d0
2383
2384107                                                                     &
2385Q70=Q70+f*(16d0*gx(0)*gy(0)*gz(7)-168d0*gx(0)*gy(2)*gz(5)               &
2386    -168d0*gx(2)*gy(0)*gz(5)+210d0*gx(0)*gy(4)*gz(3)                    &
2387    +420d0*gx(2)*gy(2)*gz(3)+210d0*gx(4)*gy(0)*gz(3)                    &
2388    -35d0*gx(0)*gy(6)*gz(1)-105d0*gx(2)*gy(4)*gz(1)                     &
2389    -105d0*gx(4)*gy(2)*gz(1)-35d0*gx(6)*gy(0)*gz(1))/16d0
2390Q71s=Q71s+f*rt(7)*(64d0*gx(0)*gy(1)*gz(6)-240d0*gx(0)*gy(3)*gz(4)       &
2391    -240d0*gx(2)*gy(1)*gz(4)+120d0*gx(0)*gy(5)*gz(2)                    &
2392    +240d0*gx(2)*gy(3)*gz(2)+120d0*gx(4)*gy(1)*gz(2)                    &
2393    -5d0*gx(0)*gy(7)*gz(0)-15d0*gx(2)*gy(5)*gz(0)                       &
2394    -15d0*gx(4)*gy(3)*gz(0)-5d0*gx(6)*gy(1)*gz(0))/32d0
2395Q71c=Q71c+f*rt(7)*(64d0*gx(1)*gy(0)*gz(6)-240d0*gx(1)*gy(2)*gz(4)       &
2396    -240d0*gx(3)*gy(0)*gz(4)+120d0*gx(1)*gy(4)*gz(2)                    &
2397    +240d0*gx(3)*gy(2)*gz(2)+120d0*gx(5)*gy(0)*gz(2)                    &
2398    -5d0*gx(1)*gy(6)*gz(0)-15d0*gx(3)*gy(4)*gz(0)                       &
2399    -15d0*gx(5)*gy(2)*gz(0)-5d0*gx(7)*gy(0)*gz(0))/32d0
2400Q72s=Q72s+f*rt(2)*rt(3)*rt(7)*(96d0*gx(1)*gy(1)*gz(5)                   &
2401    -160d0*gx(1)*gy(3)*gz(3)-160d0*gx(3)*gy(1)*gz(3)                    &
2402    +30d0*gx(1)*gy(5)*gz(1)+60d0*gx(3)*gy(3)*gz(1)                      &
2403    +30d0*gx(5)*gy(1)*gz(1))/32d0
2404Q72c=Q72c+f*rt(2)*rt(3)*rt(7)*(-48d0*gx(0)*gy(2)*gz(5)                  &
2405    +48d0*gx(2)*gy(0)*gz(5)+80d0*gx(0)*gy(4)*gz(3)                      &
2406    -80d0*gx(4)*gy(0)*gz(3)-15d0*gx(0)*gy(6)*gz(1)                      &
2407    -15d0*gx(2)*gy(4)*gz(1)+15d0*gx(4)*gy(2)*gz(1)                      &
2408    +15d0*gx(6)*gy(0)*gz(1))/32d0
2409Q73s=Q73s+f*rt(3)*rt(7)*(-80d0*gx(0)*gy(3)*gz(4)                        &
2410    +240d0*gx(2)*gy(1)*gz(4)+60d0*gx(0)*gy(5)*gz(2)                     &
2411    -120d0*gx(2)*gy(3)*gz(2)-180d0*gx(4)*gy(1)*gz(2)                    &
2412    -3d0*gx(0)*gy(7)*gz(0)+3d0*gx(2)*gy(5)*gz(0)                        &
2413    +15d0*gx(4)*gy(3)*gz(0)+9d0*gx(6)*gy(1)*gz(0))/32d0
2414Q73c=Q73c+f*rt(3)*rt(7)*(-240d0*gx(1)*gy(2)*gz(4)                       &
2415    +80d0*gx(3)*gy(0)*gz(4)+180d0*gx(1)*gy(4)*gz(2)                     &
2416    +120d0*gx(3)*gy(2)*gz(2)-60d0*gx(5)*gy(0)*gz(2)                     &
2417    -9d0*gx(1)*gy(6)*gz(0)-15d0*gx(3)*gy(4)*gz(0)                       &
2418    -3d0*gx(5)*gy(2)*gz(0)+3d0*gx(7)*gy(0)*gz(0))/32d0
2419Q74s=Q74s+f*rt(3)*rt(7)*rt(11)*(-40d0*gx(1)*gy(3)*gz(3)                 &
2420    +40d0*gx(3)*gy(1)*gz(3)+12d0*gx(1)*gy(5)*gz(1)                      &
2421    -12d0*gx(5)*gy(1)*gz(1))/16d0
2422Q74c=Q74c+f*rt(3)*rt(7)*rt(11)*(10d0*gx(0)*gy(4)*gz(3)                  &
2423    -60d0*gx(2)*gy(2)*gz(3)+10d0*gx(4)*gy(0)*gz(3)                      &
2424    -3d0*gx(0)*gy(6)*gz(1)+15d0*gx(2)*gy(4)*gz(1)                       &
2425    +15d0*gx(4)*gy(2)*gz(1)-3d0*gx(6)*gy(0)*gz(1))/16d0
2426Q75s=Q75s+f*rt(3)*rt(7)*rt(11)*(12d0*gx(0)*gy(5)*gz(2)                  &
2427    -120d0*gx(2)*gy(3)*gz(2)+60d0*gx(4)*gy(1)*gz(2)-gx(0)*gy(7)*gz(0)   &
2428    +9d0*gx(2)*gy(5)*gz(0)+5d0*gx(4)*gy(3)*gz(0)-5d0*gx(6)*gy(1)*gz(0)) &
2429    /32d0
2430Q75c=Q75c+f*rt(3)*rt(7)*rt(11)*(60d0*gx(1)*gy(4)*gz(2)                  &
2431    -120d0*gx(3)*gy(2)*gz(2)+12d0*gx(5)*gy(0)*gz(2)                     &
2432    -5d0*gx(1)*gy(6)*gz(0)+5d0*gx(3)*gy(4)*gz(0)+9d0*gx(5)*gy(2)*gz(0)  &
2433    -gx(7)*gy(0)*gz(0))/32d0
2434Q76s=Q76s+f*rt(2)*rt(3)*rt(7)*rt(11)*rt(13)*(6d0*gx(1)*gy(5)*gz(1)      &
2435    -20d0*gx(3)*gy(3)*gz(1)+6d0*gx(5)*gy(1)*gz(1))/32d0
2436Q76c=Q76c+f*rt(2)*rt(3)*rt(7)*rt(11)*rt(13)*(-gx(0)*gy(6)*gz(1)         &
2437    +15d0*gx(2)*gy(4)*gz(1)-15d0*gx(4)*gy(2)*gz(1)+gx(6)*gy(0)*gz(1))   &
2438    /32d0
2439Q77s=Q77s+f*rt(3)*rt(11)*rt(13)*(-gx(0)*gy(7)*gz(0)                     &
2440    +21d0*gx(2)*gy(5)*gz(0)-35d0*gx(4)*gy(3)*gz(0)                      &
2441    +7d0*gx(6)*gy(1)*gz(0))/32d0
2442Q77c=Q77c+f*rt(3)*rt(11)*rt(13)*(-7d0*gx(1)*gy(6)*gz(0)                 &
2443    +35d0*gx(3)*gy(4)*gz(0)-21d0*gx(5)*gy(2)*gz(0)+gx(7)*gy(0)*gz(0))   &
2444    /32d0
2445
2446106                                                                     &
2447Q60=Q60+f*(16d0*gx(0)*gy(0)*gz(6)-120d0*gx(0)*gy(2)*gz(4)               &
2448    -120d0*gx(2)*gy(0)*gz(4)+90d0*gx(0)*gy(4)*gz(2)                     &
2449    +180d0*gx(2)*gy(2)*gz(2)+90d0*gx(4)*gy(0)*gz(2)                     &
2450    -5d0*gx(0)*gy(6)*gz(0)-15d0*gx(2)*gy(4)*gz(0)                       &
2451    -15d0*gx(4)*gy(2)*gz(0)-5d0*gx(6)*gy(0)*gz(0))/16d0
2452Q61s=Q61s+f*rt(3)*rt(7)*(8d0*gx(0)*gy(1)*gz(5)-20d0*gx(0)*gy(3)*gz(3)   &
2453    -20d0*gx(2)*gy(1)*gz(3)+5d0*gx(0)*gy(5)*gz(1)                       &
2454    +10d0*gx(2)*gy(3)*gz(1)+5d0*gx(4)*gy(1)*gz(1))/8d0
2455Q61c=Q61c+f*rt(3)*rt(7)*(8d0*gx(1)*gy(0)*gz(5)-20d0*gx(1)*gy(2)*gz(3)   &
2456    -20d0*gx(3)*gy(0)*gz(3)+5d0*gx(1)*gy(4)*gz(1)                       &
2457    +10d0*gx(3)*gy(2)*gz(1)+5d0*gx(5)*gy(0)*gz(1))/8d0
2458Q62s=Q62s+f*rt(2)*rt(3)*rt(5)*rt(7)*(32d0*gx(1)*gy(1)*gz(4)             &
2459    -32d0*gx(1)*gy(3)*gz(2)-32d0*gx(3)*gy(1)*gz(2)                      &
2460    +2d0*gx(1)*gy(5)*gz(0)+4d0*gx(3)*gy(3)*gz(0)+2d0*gx(5)*gy(1)*gz(0)) &
2461    /32d0
2462Q62c=Q62c+f*rt(2)*rt(3)*rt(5)*rt(7)*(-16d0*gx(0)*gy(2)*gz(4)            &
2463    +16d0*gx(2)*gy(0)*gz(4)+16d0*gx(0)*gy(4)*gz(2)                      &
2464    -16d0*gx(4)*gy(0)*gz(2)-gx(0)*gy(6)*gz(0)-gx(2)*gy(4)*gz(0)         &
2465    +gx(4)*gy(2)*gz(0)+gx(6)*gy(0)*gz(0))/32d0
2466Q63s=Q63s+f*rt(2)*rt(3)*rt(5)*rt(7)*(-8d0*gx(0)*gy(3)*gz(3)             &
2467    +24d0*gx(2)*gy(1)*gz(3)+3d0*gx(0)*gy(5)*gz(1)                       &
2468    -6d0*gx(2)*gy(3)*gz(1)-9d0*gx(4)*gy(1)*gz(1))/16d0
2469Q63c=Q63c+f*rt(2)*rt(3)*rt(5)*rt(7)*(-24d0*gx(1)*gy(2)*gz(3)            &
2470    +8d0*gx(3)*gy(0)*gz(3)+9d0*gx(1)*gy(4)*gz(1)+6d0*gx(3)*gy(2)*gz(1)  &
2471    -3d0*gx(5)*gy(0)*gz(1))/16d0
2472Q64s=Q64s+f*rt(7)*(-120d0*gx(1)*gy(3)*gz(2)+120d0*gx(3)*gy(1)*gz(2)     &
2473    +12d0*gx(1)*gy(5)*gz(0)-12d0*gx(5)*gy(1)*gz(0))/16d0
2474Q64c=Q64c+f*rt(7)*(30d0*gx(0)*gy(4)*gz(2)-180d0*gx(2)*gy(2)*gz(2)       &
2475    +30d0*gx(4)*gy(0)*gz(2)-3d0*gx(0)*gy(6)*gz(0)                       &
2476    +15d0*gx(2)*gy(4)*gz(0)+15d0*gx(4)*gy(2)*gz(0)                      &
2477    -3d0*gx(6)*gy(0)*gz(0))/16d0
2478Q65s=Q65s+f*rt(2)*rt(7)*rt(11)*(3d0*gx(0)*gy(5)*gz(1)                   &
2479    -30d0*gx(2)*gy(3)*gz(1)+15d0*gx(4)*gy(1)*gz(1))/16d0
2480Q65c=Q65c+f*rt(2)*rt(7)*rt(11)*(15d0*gx(1)*gy(4)*gz(1)                  &
2481    -30d0*gx(3)*gy(2)*gz(1)+3d0*gx(5)*gy(0)*gz(1))/16d0
2482Q66s=Q66s+f*rt(2)*rt(3)*rt(7)*rt(11)*(6d0*gx(1)*gy(5)*gz(0)             &
2483    -20d0*gx(3)*gy(3)*gz(0)+6d0*gx(5)*gy(1)*gz(0))/32d0
2484Q66c=Q66c+f*rt(2)*rt(3)*rt(7)*rt(11)*(-gx(0)*gy(6)*gz(0)                &
2485    +15d0*gx(2)*gy(4)*gz(0)-15d0*gx(4)*gy(2)*gz(0)+gx(6)*gy(0)*gz(0))   &
2486    /32d0
2487
2488105                                                                     &
2489Q50=Q50+f*(8d0*gx(0)*gy(0)*gz(5)-40d0*gx(0)*gy(2)*gz(3)                 &
2490    -40d0*gx(2)*gy(0)*gz(3)+15d0*gx(0)*gy(4)*gz(1)                      &
2491    +30d0*gx(2)*gy(2)*gz(1)+15d0*gx(4)*gy(0)*gz(1))/8d0
2492Q51s=Q51s+f*rt(3)*rt(5)*(8d0*gx(0)*gy(1)*gz(4)-12d0*gx(0)*gy(3)*gz(2)   &
2493    -12d0*gx(2)*gy(1)*gz(2)+gx(0)*gy(5)*gz(0)+2d0*gx(2)*gy(3)*gz(0)     &
2494    +gx(4)*gy(1)*gz(0))/8d0
2495Q51c=Q51c+f*rt(3)*rt(5)*(8d0*gx(1)*gy(0)*gz(4)-12d0*gx(1)*gy(2)*gz(2)   &
2496    -12d0*gx(3)*gy(0)*gz(2)+gx(1)*gy(4)*gz(0)+2d0*gx(3)*gy(2)*gz(0)     &
2497    +gx(5)*gy(0)*gz(0))/8d0
2498Q52s=Q52s+f*rt(3)*rt(5)*rt(7)*(4d0*gx(1)*gy(1)*gz(3)                    &
2499    -2d0*gx(1)*gy(3)*gz(1)-2d0*gx(3)*gy(1)*gz(1))/4d0
2500Q52c=Q52c+f*rt(3)*rt(5)*rt(7)*(-2d0*gx(0)*gy(2)*gz(3)                   &
2501    +2d0*gx(2)*gy(0)*gz(3)+gx(0)*gy(4)*gz(1)-gx(4)*gy(0)*gz(1))/4d0
2502Q53s=Q53s+f*rt(2)*rt(5)*rt(7)*(-8d0*gx(0)*gy(3)*gz(2)                   &
2503    +24d0*gx(2)*gy(1)*gz(2)+gx(0)*gy(5)*gz(0)-2d0*gx(2)*gy(3)*gz(0)     &
2504    -3d0*gx(4)*gy(1)*gz(0))/16d0
2505Q53c=Q53c+f*rt(2)*rt(5)*rt(7)*(-24d0*gx(1)*gy(2)*gz(2)                  &
2506    +8d0*gx(3)*gy(0)*gz(2)+3d0*gx(1)*gy(4)*gz(0)+2d0*gx(3)*gy(2)*gz(0)  &
2507    -gx(5)*gy(0)*gz(0))/16d0
2508Q54s=Q54s+f*rt(5)*rt(7)*(-12d0*gx(1)*gy(3)*gz(1)                        &
2509    +12d0*gx(3)*gy(1)*gz(1))/8d0
2510Q54c=Q54c+f*rt(5)*rt(7)*(3d0*gx(0)*gy(4)*gz(1)-18d0*gx(2)*gy(2)*gz(1)   &
2511    +3d0*gx(4)*gy(0)*gz(1))/8d0
2512Q55s=Q55s+f*rt(2)*rt(7)*(3d0*gx(0)*gy(5)*gz(0)-30d0*gx(2)*gy(3)*gz(0)   &
2513    +15d0*gx(4)*gy(1)*gz(0))/16d0
2514Q55c=Q55c+f*rt(2)*rt(7)*(15d0*gx(1)*gy(4)*gz(0)-30d0*gx(3)*gy(2)*gz(0)  &
2515    +3d0*gx(5)*gy(0)*gz(0))/16d0
2516
2517!  Hexadecapole terms
2518104                                                                     &
2519Q40=Q40+f*(8d0*gx(0)*gy(0)*gz(4)-24d0*gx(0)*gy(2)*gz(2)                 &
2520    -24d0*gx(2)*gy(0)*gz(2)+3d0*gx(0)*gy(4)*gz(0)                       &
2521    +6d0*gx(2)*gy(2)*gz(0)+3d0*gx(4)*gy(0)*gz(0))/8d0
2522Q41s=Q41s+f*rt(2)*rt(5)*(4d0*gx(0)*gy(1)*gz(3)-3d0*gx(0)*gy(3)*gz(1)    &
2523    -3d0*gx(2)*gy(1)*gz(1))/4d0
2524Q41c=Q41c+f*rt(2)*rt(5)*(4d0*gx(1)*gy(0)*gz(3)-3d0*gx(1)*gy(2)*gz(1)    &
2525    -3d0*gx(3)*gy(0)*gz(1))/4d0
2526Q42s=Q42s+f*rt(5)*(12d0*gx(1)*gy(1)*gz(2)-2d0*gx(1)*gy(3)*gz(0)         &
2527    -2d0*gx(3)*gy(1)*gz(0))/4d0
2528Q42c=Q42c+f*rt(5)*(-6d0*gx(0)*gy(2)*gz(2)+6d0*gx(2)*gy(0)*gz(2)         &
2529    +gx(0)*gy(4)*gz(0)-gx(4)*gy(0)*gz(0))/4d0
2530Q43s=Q43s+f*rt(2)*rt(5)*rt(7)*(-gx(0)*gy(3)*gz(1)                       &
2531    +3d0*gx(2)*gy(1)*gz(1))/4d0
2532Q43c=Q43c+f*rt(2)*rt(5)*rt(7)*(-3d0*gx(1)*gy(2)*gz(1)                   &
2533    +gx(3)*gy(0)*gz(1))/4d0
2534Q44s=Q44s+f*rt(5)*rt(7)*(-4d0*gx(1)*gy(3)*gz(0)+4d0*gx(3)*gy(1)*gz(0))  &
2535    /8d0
2536Q44c=Q44c+f*rt(5)*rt(7)*(gx(0)*gy(4)*gz(0)-6d0*gx(2)*gy(2)*gz(0)        &
2537    +gx(4)*gy(0)*gz(0))/8d0
2538
2539!  Octopole terms
2540103                                                                     &
2541Q30=Q30+f*(2d0*gx(0)*gy(0)*gz(3)-3d0*gx(0)*gy(2)*gz(1)                  &
2542    -3d0*gx(2)*gy(0)*gz(1))/2d0
2543Q31s=Q31s+f*rt(2)*rt(3)*(4d0*gx(0)*gy(1)*gz(2)-gx(0)*gy(3)*gz(0)        &
2544    -gx(2)*gy(1)*gz(0))/4d0
2545Q31c=Q31c+f*rt(2)*rt(3)*(4d0*gx(1)*gy(0)*gz(2)-gx(1)*gy(2)*gz(0)        &
2546    -gx(3)*gy(0)*gz(0))/4d0
2547Q32s=Q32s+f*rt(3)*rt(5)*(2d0*gx(1)*gy(1)*gz(1))/2d0
2548Q32c=Q32c+f*rt(3)*rt(5)*(-gx(0)*gy(2)*gz(1)+gx(2)*gy(0)*gz(1))/2d0
2549Q33s=Q33s+f*rt(2)*rt(5)*(-gx(0)*gy(3)*gz(0)+3d0*gx(2)*gy(1)*gz(0))/4d0
2550Q33c=Q33c+f*rt(2)*rt(5)*(-3d0*gx(1)*gy(2)*gz(0)+gx(3)*gy(0)*gz(0))/4d0
2551
2552!  Quadrupole terms
2553102                                                                     &
2554Q20=Q20+f*(2d0*gx(0)*gy(0)*gz(2)-gx(0)*gy(2)*gz(0)-gx(2)*gy(0)*gz(0))/2d0
2555Q21s=Q21s+f*rt(3)*(gx(0)*gy(1)*gz(1))
2556Q21c=Q21c+f*rt(3)*(gx(1)*gy(0)*gz(1))
2557Q22s=Q22s+f*rt(3)*(2d0*gx(1)*gy(1)*gz(0))/2d0
2558Q22c=Q22c+f*rt(3)*(-gx(0)*gy(2)*gz(0)+gx(2)*gy(0)*gz(0))/2d0
2559
2560!  Dipole terms
2561101   Q10=Q10+f*(gx(0)*gy(0)*gz(1))
2562Q11s=Q11s+f*(gx(0)*gy(1)*gz(0))
2563Q11c=Q11c+f*(gx(1)*gy(0)*gz(0))
2564!  Monopole term
2565100   Q00=Q00+F*GX(0)*GY(0)*GZ(0)
2566
2567      END SUBROUTINE addqlm
2568
2569!-----------------------------------------------------------------SHIFTQ
2570
2571SUBROUTINE shiftq (q1,l1,m1, q2,m2, x,y,z)
2572IMPLICIT NONE
2573REAL(dp), INTENT(IN) :: q1(121), x, y, z
2574INTEGER, INTENT(IN) :: l1, m1, m2
2575REAL(dp), INTENT(INOUT) :: q2(121)
2576!-----------------------------------------------------
2577!     Copyright A J Stone University of Cambridge 1983
2578!     Modifications and interface to Cadpac, R D Amos
2579!     Version for Cadpac5 , R D Amos, June 1990
2580!-----------------------------------------------------
2581!  Shift the multipoles Q1 relative to the point (X,Y,Z) to the point
2582!  (0,0,0) and add them to the multipole expansion Q2
2583!  Multipoles of ranks L1 through M1 are to be tranferred from Q1
2584!  and added to Q2, keeping ranks up to M2 in the transferred expansion.
2585!  Q2(L,M) = sum(K,Q) sqrt | (L+M) (L-M) | * Q1(K,Q) * R(L-K,M-Q)
2586!                          | (K+Q) (K-Q) |
2587!  where the quantities in the square root are binomial coefficients
2588!  and the R() are regular solid harmonics of (x,y,z).
2589
2590!  Real multipoles and harmonics are in the order
2591!  Q00, Q10, Q11c, Q11s, Q20, ...
2592!  Complex multipoles and harmonics are in the order
2593!  Q00, Q1-1, Q10, Q11, Q2-2, ...
2594REAL(dp), PARAMETER :: RTHALF=0.7071067811865475244D0, EPS=0.0D0
2595
2596REAL(dp) :: R(121), r2, a, s
2597INTEGER :: i, jb, k, k1, kb, km, kmax, l, lb, lm, m, n2,         &
2598    qmin, qmax, qq, t1, t2
2599REAL(dp) :: RC(121,2), QC(121,2), QZ(121,2)
2600
2601IF (L1 .GT. M1 .OR. L1 .GT. M2) RETURN
2602!  Estimate largest significant transferred multipole.  The magnitude of
2603!  the contribution of the Q(k,q) to Q2(l,m) is of order
2604!  |Q(k)|*R**(l-k), multiplied by binomial coefficient factors which we
2605!  estimate as 2**(l-k).  If the total of such estimates for rank l is
2606!  greater than sqrt(EPS), transfers up to rank l are calculated
2607!  explicitly.
2608!  If EPS is zero, this procedure is bypassed.
2609n2=m2
2610k1=max0(1,l1)
2611if (eps .ne. 0.0d0 .and. m2 .gt. 0) then
2612  r2=4.0d0*(x**2+y**2+z**2)
2613  n2=0
2614  a=0.0d0
2615  if (l1 .eq. 0) a=q1(1)**2
2616  do k=k1,m2
2617    a=a*r2
2618    if (k .le. m1) then
2619      t1=k**2+1
2620      t2=(k+1)**2
2621      do i=t1,t2
2622        a=a+q1(i)**2
2623      end do
2624    end if
2625    if (a .gt. eps) n2=k
2626  end do
2627end if
2628!  Evaluate solid harmonics in real form
2629call solidh (x,y,z, n2, r,121)
2630!  Construct complex solid harmonics RC
2631rc(1,1)=r(1)
2632rc(1,2)=0.0d0
2633do k=1,n2
2634  kb=k**2+k+1
2635  km=k**2+1
2636  rc(kb,1)=r(km)
2637  rc(kb,2)=0.0d0
2638  km=km+1
2639  s=rthalf
2640  do m=1,k
2641    s=-s
2642    rc(kb-m,1)=rthalf*r(km)
2643    rc(kb-m,2)=-rthalf*r(km+1)
2644    rc(kb+m,1)=s*r(km)
2645    rc(kb+m,2)=s*r(km+1)
2646    km=km+2
2647  end do
2648end do
2649!  Construct complex multipoles QC corresponding to original
2650!  real multipoles Q1
2651if (l1 .eq. 0) then
2652  qc(1,1)=q1(1)
2653  qc(1,2)=0.0d0
2654endif
2655if (m1 .gt. 0) then
2656  do k=k1,m1
2657    kb=k**2+k+1
2658    km=k**2+1
2659    qc(kb,1)=q1(km)
2660    qc(kb,2)=0.0d0
2661    km=km+1
2662    s=rthalf
2663    do m=1,k
2664      s=-s
2665      qc(kb-m,1)=rthalf*q1(km)
2666      qc(kb-m,2)=-rthalf*q1(km+1)
2667      qc(kb+m,1)=s*q1(km)
2668      qc(kb+m,2)=s*q1(km+1)
2669      km=km+2
2670    end do
2671  end do
2672end if
2673!  Construct shifted complex multipoles QZ (only for non-negative M)
2674if (l1 .eq. 0) then
2675  qz(1,1)=qc(1,1)
2676  qz(1,2)=qc(1,2)
2677endif
2678do l=k1,n2
2679  kmax=min0(l,m1)
2680  lb=l**2+l+1
2681  lm=lb
2682  m=0
2683  do while (m .le. l)
2684    qz(lm,1)=0.0d0
2685    qz(lm,2)=0.0d0
2686    if (l1 .eq. 0) then
2687      qz(lm,1)=qc(1,1)*rc(lm,1)-qc(1,2)*rc(lm,2)
2688      qz(lm,2)=qc(1,1)*rc(lm,2)+qc(1,2)*rc(lm,1)
2689    endif
2690      do k=k1,kmax
2691        qmin=max0(-k,k-l+m)
2692        qmax=min0(k,l-k+m)
2693        kb=k**2+k+1
2694        jb=(l-k)**2+(l-k)+1
2695        do qq=qmin,qmax
2696          qz(lm,1)=qz(lm,1)+rtbinom(l+m,k+qq)*rtbinom(l-m,k-qq)            &
2697              *(qc(kb+qq,1)*rc(jb+m-qq,1)-qc(kb+qq,2)*rc(jb+m-qq,2))
2698          qz(lm,2)=qz(lm,2)+rtbinom(l+m,k+qq)*rtbinom(l-m,k-qq)            &
2699              *(qc(kb+qq,1)*rc(jb+m-qq,2)+qc(kb+qq,2)*rc(jb+m-qq,1))
2700        end do
2701      end do
2702      m=m+1
2703    lm=lm+1
2704  end do
2705end do
2706!  Construct real multipoles and add to Q2
2707if (l1 .eq. 0) q2(1)=q2(1)+qz(1,1)
2708do k=k1,n2
2709  kb=k**2+k+1
2710  km=k**2+1
2711  q2(km)=q2(km)+qz(kb,1)
2712  s=1.0d0/rthalf
2713  km=km+1
2714  do m=1,k
2715    s=-s
2716    q2(km)=q2(km)+s*qz(kb+m,1)
2717    q2(km+1)=q2(km+1)+s*qz(kb+m,2)
2718    km=km+2
2719  end do
2720end do
2721
2722END SUBROUTINE shiftq
2723
2724!----------------------------------------------------------------- MOVEQ
2725
2726SUBROUTINE moveq (x,y,z)
2727IMPLICIT NONE
2728REAL(dp), INTENT(IN) :: x, y, z
2729!-----------------------------------------------------
2730!     Copyright A J Stone University of Cambridge 1983
2731!     Modifications and interface to Cadpac, R D Amos
2732!     Version for Cadpac5 , R D Amos, June 1990
2733!-----------------------------------------------------
2734!  Move the set of multipoles in QT to the nearest multipole site
2735!  (but if two or more sites are almost equidistant, move a fraction
2736!  to each).
2737
2738REAL(dp) :: qt
2739COMMON/BIG/qt(121)
2740
2741REAL(dp) :: an, rr(maxs)
2742REAL(dp), PARAMETER :: eps=1d-6
2743INTEGER :: i, j, k, l, low, lp1sq, m(6), n, t1, t2
2744
2745j=1
2746do i=1,ns
2747  rr(i)=((x-xs(1,i))**2 + (y-xs(2,i))**2 + (z-xs(3,i))**2)         &
2748      /radius(i)**2
2749  if (limit(i) .gt. limit(j)) j=i
2750end do
2751lp1sq=(lmax+1)**2
2752low=0
2753do
2754  k=j
2755  do i=1,ns
2756    if (rr(i) .lt. rr(k) .and. limit(i) .ge. low) k=i
2757  end do
2758  t1=low**2+1
2759  t2=(limit(k)+1)**2
2760  if (rr(k) .le. 1d-6) then
2761    do i=t1,t2
2762      q(i,k)=q(i,k)+qt(i)
2763      qt(i)=0.0d0
2764    end do
2765    if (limit(k) .ge. lmax) return
2766  else
2767    n=1
2768    m(1)=k
2769    do i=1,ns
2770      if (rr(i) .gt. rr(k)+eps .or. i .eq. k .or.                      &
2771          limit(i) .ne. limit(k) .or. limit(i) .lt. low) cycle
2772      n=n+1
2773      m(n)=i
2774    end do
2775    if (n .gt. 1) then
2776      an=1.0d0/dble(n)
2777      do k=t1,t2
2778        qt(k)=an*qt(k)
2779      end do
2780    end if
2781    do i=1,n
2782      k=m(i)
2783      call shiftq (qt,low,limit(k), q(1:,k),lmax,                      &
2784          x-xs(1,k),y-xs(2,k),z-xs(3,k))
2785    end do
2786    do i=t1,t2
2787      qt(i)=0.0d0
2788    end do
2789    if (limit(k) .ge. lmax) return
2790    t1=t2+1
2791    do i=1,n
2792      k=m(i)
2793      call shiftq(q(1:,k),limit(k)+1,lmax, qt,lmax,                    &
2794          xs(1,k)-x,xs(2,k)-y,xs(3,k)-z)
2795      do l=t1,lp1sq
2796        q(l,k)=0.0d0
2797      end do
2798    end do
2799  end if
2800  low=limit(k)+1
2801end do
2802
2803END SUBROUTINE moveq
2804
2805!-----------------------------------------------------------------SOLIDH
2806
2807SUBROUTINE solidh (X,Y,Z, J, R,MAX)
2808USE input, ONLY : die
2809IMPLICIT NONE
2810REAL(dp), INTENT(IN) :: x, y, z
2811INTEGER, INTENT(IN) :: j, max
2812REAL(dp), INTENT(OUT) :: r(max)
2813!-----------------------------------------------------
2814!     Copyright A J Stone University of Cambridge 1983
2815!     Modifications and interface to Cadpac, R D Amos
2816!     Version for Cadpac5 , R D Amos, June 1990
2817!-----------------------------------------------------
2818!  Computes regular solid harmonics r**k Ckq(theta,phi) for ranks k up
2819!  to J, if J >= 0;
2820!  or irregular solid harmonics r**(-k-1) Ckq(theta,phi) for ranks k up
2821!  to |J|, if J < 0.
2822
2823!  Locations in R are used as follows:
2824!        1    2    3    4    5    6    7    8    9   10   11  ...
2825!  kq = 00   10   11c  11s  20   21c  21s  22c  22s  30   31c ...
2826!  R(k,0) is real and is left in location k**2 + 1.
2827!  R(k,mc) and r(k,ms) are sqrt(2) times the real and imaginary parts
2828!  respectively of the complex solid harmonic R(k,-m)* = (-1)**m R(k,m),
2829!  and are left in locations K**2 + 2m and K**2 + 2m + 1 respectively.
2830
2831INTEGER :: k, l, lk, ln, lp, m, n
2832REAL(dp) :: a2kp1, rr, rfx, rfy, rfz, s
2833
2834l=iabs(j)
2835if ((l+1)**2 .gt. max) then
2836  write (6,'(a,i3)')                                           &
2837      'Insufficient array space for harmonics up to rank',L
2838  call die('Consult authors')
2839endif
2840rr=x**2+y**2+z**2
2841if (j .ge. 0) then
2842!  Regular
2843  r(1)=1.0d0
2844  r(2)=z
2845  r(3)=x
2846  r(4)=y
2847  rfz=z
2848  rfx=x
2849  rfy=y
2850else
2851!  Irregular
2852  rr=1.0d0/rr
2853  rfx=x*rr
2854  rfy=y*rr
2855  rfz=z*rr
2856  r(1)=dsqrt(rr)
2857  r(2)=rfz*r(1)
2858  r(3)=rfx*r(1)
2859  r(4)=rfy*r(1)
2860endif
2861!  Remaining values are found using recursion formulae, relating
2862!  the new set N to the current set K and the previous set P.
2863k=1
2864do while (k<l)
2865  n=k+1
2866  ln=n*n+1
2867  lk=k*k+1
2868  lp=(k-1)**2+1
2869  a2kp1=k+k+1
2870!  Obtain R(k+1,0) from R(k,0)*R(1,0) and R(k-1,0)
2871  r(ln)=(a2kp1*r(lk)*rfz-k*rr*r(lp))/(k+1)
2872  m=1
2873  ln=ln+1
2874  lk=lk+1
2875  lp=lp+1
2876  if (k .gt. 1) then
2877    do while (m<k)
2878!  Obtain R(k+1,m) from R(k,m)*R(1,0) and R(k-1,m)
2879      r(ln)=(a2kp1*r(lk)*rfz-rt(k+m)*rt(k-m)*rr*r(lp))                  &
2880                                           /(rt(n+m)*rt(n-m))
2881      r(ln+1)=(a2kp1*r(lk+1)*rfz-rt(k+m)*rt(k-m)*rr*r(lp+1))            &
2882                                           /(rt(n+m)*rt(n-m))
2883      m=m+1
2884      ln=ln+2
2885      lk=lk+2
2886      lp=lp+2
2887    end do
2888  end if
2889!  Obtain R(k+1,k) from R(k,k)*R(1,0)
2890  r(ln)=rt(n+k)*r(lk)*rfz
2891  r(ln+1)=rt(n+k)*r(lk+1)*rfz
2892  ln=ln+2
2893!  Obtain R(k+1,k+1) from R(k,k)*R(1,1)
2894  s=rt(n+k)/rt(n+n)
2895  r(ln)=s*(rfx*r(lk)-rfy*r(lk+1))
2896  r(ln+1)=s*(rfx*r(lk+1)+rfy*r(lk))
2897  k=k+1
2898end do
2899
2900END SUBROUTINE solidh
2901
2902!-----------------------------------------------------------------PRINTQ
2903
2904SUBROUTINE printq(q,lm, linear, iw)
2905IMPLICIT NONE
2906REAL(dp), INTENT(IN) :: q(0:121)
2907INTEGER, INTENT(IN) :: lm, iw
2908LOGICAL, INTENT(IN) :: linear
2909
2910!-----------------------------------------------------
2911!     Copyright A J Stone University of Cambridge 1983
2912!     Modifications and interface to Cadpac, R D Amos
2913!     Version for Cadpac5 , R D Amos, June 1990
2914!-----------------------------------------------------
2915
2916INTEGER :: p(31)
2917LOGICAL :: big
2918
2919CHARACTER(LEN=2) :: ql(15)=(/'Q1','Q2','Q3','Q4','Q5','Q6','Q7',       &
2920    'Q8','Q9','QA','QB','QC','QD','QE','QF'/)
2921CHARACTER(LEN=2) :: qm(31)=(/'0 ','1c','1s','2c','2s','3c','3s',       &
2922    '4c','4s','5c','5s','6c','6s','7c','7s','8c','8s','9c','9s',       &
2923    'Ac','As', 'Bc','Bs','Cc','Cs','Dc','Ds','Ec','Es','Fc','Fs'/)
2924CHARACTER :: LQ='Q'
2925INTEGER :: i, k, l, ll1, n
2926REAL(dp) :: qs, qsq, qf
2927
2928if (linear) then
2929  write (iw,1006) (lq, k, q(k)*Qfactor(k), k=0,lm)
29301006 FORMAT (3(5x, a1, i1, ' =', f14.8)/                               &
2931         3(5x, a1, i1, ' =', f14.8)/                                   &
2932         3(5x, a1, i1, ' =', f14.8)/                                   &
2933         5x, a1, i1, ' =', f14.8, 2(4x, a1, i2, ' =', f14.8)/          &
2934         (3(4x, a1, i2, ' =', f14.8)))
2935ELSE
2936  write (iw,'(19x, a, f11.6)') 'Q00  =', q(1)*Qfactor(0)
2937  k=1
2938  do l=1,lm
2939    qf=Qfactor(l)
2940    ll1=l+l+1
2941    n=0
2942    qsq=0d0
2943    do i=1,ll1
2944      qsq=qsq+q(k+i)**2
2945      if (dabs(q(k+i)) .ge. 5d-7) then
2946        n=n+1
2947        p(n)=i
2948      end if
2949    end do
2950    qs=dsqrt(qsq)
2951    big=(qs .ge. 1d3)
2952    if (n .gt. 0 .and. big) write (iw,1001) ql(l), qs*qf,              &
2953        (ql(l), qm(p(i)), q(p(i)+k)*qf, i=1,n)
2954    if (n .eq. 0 .and. .not. big) write (iw,1002) ql(l), qs*qf
2955    if (n .gt. 0 .and. .not. big) write (iw,1002) ql(l), qs*qf,        &
2956        (ql(l), qm(p(i)), q(p(i)+k)*qf, i=1,n)
29571001 FORMAT ('|', a2, '| =', 1p,e11.3:, 3(2x, 2a2, ' =', e11.3:)       &
2958         / (17x, 3(2x, 2a2, ' =', e11.3:)))
29591002 FORMAT ('|', a2, '| =', f11.6:, 3(2x, 2a2, ' =', f11.6:)          &
2960         / (17x, 3(2x, 2a2, ' =', f11.6:)))
2961    k=k+ll1
2962  end do
2963endif
2964
2965END SUBROUTINE printq
2966
2967!-----------------------------------------------------------------PLANES
2968
2969SUBROUTINE planes
2970
2971!  Look for special geometries (planar or linear). On exit, LINEAR is
2972!  true if the sites are all on a line parallel to the z axis. PLANAR
2973!  is true if the sites are all in a plane parallel to one of the
2974!  coordinate planes. PERP=1 if all sites have the same x, 2 if all sites
2975!  have the same y, 4 if all sites have the same z. For linear molecules,
2976!  PERP=3, i.e. 1+2. Note that this categorization applies to the sites,
2977!  not to the atoms, so it is only relevant for calculating matrices, not
2978!  for distributed multipoles.
2979
2980IMPLICIT NONE
2981
2982REAL(dp) :: xsq, ysq, zsq, xsum, ysum, zsum
2983INTEGER :: is
2984
2985xsq=0d0
2986xsum=0d0
2987ysq=0d0
2988ysum=0d0
2989zsq=0d0
2990zsum=0d0
2991do is=1,ns
2992  xsum=xsum+xs(1,is)
2993  xsq=xsq+xs(1,is)**2
2994  ysum=ysum+xs(2,is)
2995  ysq=ysq+xs(2,is)**2
2996  zsum=zsum+xs(3,is)
2997  zsq=zsq+xs(3,is)**2
2998end do
2999perp=0
3000if (ns*xsq-xsum**2 .lt. 1D-8) perp=perp+1
3001if (ns*ysq-ysum**2 .lt. 1D-8) perp=perp+2
3002if (ns*zsq-zsum**2 .lt. 1D-8) perp=perp+4
3003if (perp == 7) then
3004  !  Atom
3005  linear=.false.
3006  general=.true.
3007else if (perp == 3) then
3008  linear=.true.
3009else if (perp .ne. 0) then
3010  planar=.true.
3011end if
3012
3013END SUBROUTINE planes
3014
3015END MODULE dma
3016