60 INTEGER,
INTENT(IN) :: method
62 CHARACTER(LEN=3),
DIMENSION(9),
PARAMETER :: &
63 label_print_orb = [
" s",
" px",
" py",
" pz",
"dx2",
"dzx",
"dz2",
"dzy",
"dxy"]
64 INTEGER,
DIMENSION(9),
PARAMETER :: loc_index = [1, 2, 2, 2, 3, 3, 3, 3, 3]
66 INTEGER :: a, b, i, ind1, ind2, j, k, k1, k2, mu, &
68 REAL(kind=
dp) :: dlm, tmp, wp, ws, zb, zp, zs, zt
69 REAL(kind=
dp),
DIMENSION(3, 3, 45) :: m2
70 REAL(kind=
dp),
DIMENSION(3, 45) :: m1
71 REAL(kind=
dp),
DIMENSION(45) :: m0
72 REAL(kind=
dp),
DIMENSION(6, 0:2) :: amn
75 cpassert(.NOT.
ASSOCIATED(mpoles))
77 natorb = se_parameter%natorb
79 ndim = natorb*(natorb + 1)/2
87 CALL amn_l(se_parameter, amn)
96 mpole => mpoles(ind2)%mpole
101 mpole%c = huge(0.0_dp)
102 mpole%d = huge(0.0_dp)
103 mpole%qs = huge(0.0_dp)
104 mpole%qc = huge(0.0_dp)
107 IF (
alm(ind1, 0, 0) /= 0.0_dp)
THEN
108 dlm = 1.0_dp/sqrt(real((2*0 + 1), kind=
dp))
109 tmp = -dlm*amn(
indexb(a, b), 0)
110 mpole%c = tmp*
alm(ind1, 0, 0)
111 mpole%task(1) = .true.
115 IF (any(
alm(ind1, 1, -1:1) /= 0.0_dp))
THEN
116 dlm = 1.0_dp/sqrt(real((2*1 + 1), kind=
dp))
117 tmp = -dlm*amn(
indexb(a, b), 1)
118 mpole%d(1) = tmp*
alm(ind1, 1, 1)
119 mpole%d(2) = tmp*
alm(ind1, 1, -1)
120 mpole%d(3) = tmp*
alm(ind1, 1, 0)
121 mpole%task(2) = .true.
125 IF (any(
alm(ind1, 2, -2:2) /= 0.0_dp))
THEN
126 dlm = 1.0_dp/sqrt(real((2*2 + 1), kind=
dp))
127 tmp = -dlm*amn(
indexb(a, b), 2)
130 mpole%qs(1) = tmp*
alm(ind1, 2, 0)
131 mpole%qs(2) = tmp*
alm(ind1, 2, 1)
132 mpole%qs(3) = tmp*
alm(ind1, 2, -1)
133 mpole%qs(4) = tmp*
alm(ind1, 2, 2)
134 mpole%qs(5) = tmp*
alm(ind1, 2, -2)
138 mpole%task(3) = .true.
141 IF (debug_this_module)
THEN
142 WRITE (*,
'(A,2I6,A)')
"Orbitals ", i, j, &
143 " ("//label_print_orb(i)//
","//label_print_orb(j)//
")"
144 IF (mpole%task(1))
WRITE (*,
'(9F12.6)') mpole%c
145 IF (mpole%task(2))
WRITE (*,
'(9F12.6)') mpole%d
146 IF (mpole%task(3))
WRITE (*,
'(9F12.6)') mpole%qc
154 cpassert(natorb <= 4)
160 DO mu = 1, se_parameter%natorb
161 m0(
indexb(mu, mu)) = 1.0_dp
164 zs = se_parameter%sto_exponents(0)
165 zp = se_parameter%sto_exponents(1)
168 ws = real((2*nr + 2)*(2*nr + 1),
dp)/(24.0_dp*zs**2)
170 m2(k, k,
indexb(1, 1)) = ws
175 zb = 0.5_dp*(zs + zp)
177 m1(k,
indexb(1, 1 + k)) = (zt/zb)**(2*nr + 1)*real(2*nr + 1,
dp)/(2.0_dp*zb*
sqrt3)
180 wp = real((2*nr + 2)*(2*nr + 1),
dp)/(40.0_dp*zp**2)
184 m2(k2, k2,
indexb(1 + k1, 1 + k1)) = 3.0_dp*wp
186 m2(k2, k2,
indexb(1 + k1, 1 + k1)) = wp
190 m2(1, 2,
indexb(1 + 1, 1 + 2)) = wp
191 m2(2, 1,
indexb(1 + 1, 1 + 2)) = wp
192 m2(2, 3,
indexb(1 + 2, 1 + 3)) = wp
193 m2(3, 2,
indexb(1 + 2, 1 + 3)) = wp
194 m2(3, 1,
indexb(1 + 3, 1 + 1)) = wp
195 m2(1, 3,
indexb(1 + 3, 1 + 1)) = wp
202 mpole => mpoles(ind2)%mpole
206 mpole%cs = -m0(
indexb(i, j))
208 mpole%ds = -m1(1:3,
indexb(i, j))
210 mpole%qq = -3._dp*m2(1:3, 1:3,
indexb(i, j))
211 IF (debug_this_module)
THEN
212 WRITE (*,
'(A,2I6,A)')
"Orbitals ", i, j, &
213 " ("//label_print_orb(i)//
","//label_print_orb(j)//
")"
214 WRITE (*,
'(9F12.6)') mpole%cs
215 WRITE (*,
'(9F12.6)') mpole%ds
216 WRITE (*,
'(9F12.6)') mpole%qq
238 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT) :: qcart
239 REAL(kind=
dp),
DIMENSION(5),
INTENT(IN) :: qsph
249 qcart(1, 1) = (qsph(4) - qsph(1)/sqrt(3.0_dp))*sqrt(3.0_dp)/2.0_dp
250 qcart(2, 1) = qsph(5)*sqrt(3.0_dp)/2.0_dp
251 qcart(3, 1) = qsph(2)*sqrt(3.0_dp)/2.0_dp
252 qcart(2, 2) = -(qsph(4) + qsph(1)/sqrt(3.0_dp))*sqrt(3.0_dp)/2.0_dp
253 qcart(3, 2) = qsph(3)*sqrt(3.0_dp)/2.0_dp
254 qcart(3, 3) = qsph(1)
256 qcart(1, 2) = qcart(2, 1)
257 qcart(1, 3) = qcart(3, 1)
258 qcart(2, 3) = qcart(3, 2)
271 INTEGER,
INTENT(IN) :: natom
273 CHARACTER(len=*),
PARAMETER :: routinen =
'nddo_mpole_setup'
277 CALL timeset(routinen, handle)
279 IF (
ASSOCIATED(nddo_mpole))
THEN
284 ALLOCATE (nddo_mpole%charge(natom))
285 ALLOCATE (nddo_mpole%dipole(3, natom))
286 ALLOCATE (nddo_mpole%quadrupole(3, 3, natom))
288 ALLOCATE (nddo_mpole%efield0(natom))
289 ALLOCATE (nddo_mpole%efield1(3, natom))
290 ALLOCATE (nddo_mpole%efield2(9, natom))
292 CALL timestop(handle)