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