ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/DarkSide/qpole.F90
Revision: 2748
Committed: Fri May 5 17:58:06 2006 UTC (18 years, 2 months ago) by gezelter
File size: 4511 byte(s)
Log Message:
Adding qpole

File Contents

# Content
1 subroutine do_electrostatic_new()
2
3 ci = ElectrostaticMap(me1)%charge
4
5 mui = ElectrostaticMap(me1)%dipole_moment
6 Thetai = ElectrostaticMap(me1)%quadrupole_moments
7 eFramei = eFrame(atom1)
8 uz_i = eFramei(:,3)
9
10
11 di = mui * uz_i
12 qi = Thetai(:)*eFramei
13
14
15 f = electric / dielec
16 xji = x(jj) - x(ii)
17 yji = y(jj) - y(ii)
18 zji = z(jj) - z(ii)
19 r2 = xji*xji + yji*yji + zji*zji
20 r = sqrt(r2)
21 rr1 = 1.0d0 / r
22 rr3 = rr1 / r2
23 rr5 = 3.0d0 * rr3 / r2
24 rr7 = 5.0d0 * rr5 / r2
25 rr9 = 7.0d0 * rr7 / r2
26 rr11 = 9.0d0 * rr9 / r2
27
28 ! construct auxiliary vectors
29
30 qir(1) = qi(1)*xji + qi(4)*yji + qi(7)*zji
31 qir(2) = qi(2)*xji + qi(5)*yji + qi(8)*zji
32 qir(3) = qi(3)*xji + qi(6)*yji + qi(9)*zji
33 qjr(1) = qj(1)*xji + qj(4)*yji + qj(7)*zji
34 qjr(2) = qj(2)*xji + qj(5)*yji + qj(8)*zji
35 qjr(3) = qj(3)*xji + qj(6)*yji + qj(9)*zji
36
37 ! get intermediate variables for energy terms
38
39 sc(2) = di(1)*dj(1) + di(2)*dj(2) + di(3)*dj(3)
40 sc(3) = di(1)*xji + di(2)*yji + di(3)*zji
41 sc(4) = dj(1)*xji + dj(2)*yji + dj(3)*zji
42 sc(5) = qir(1)*xji + qir(2)*yji + qir(3)*zji
43 sc(6) = qjr(1)*xji + qjr(2)*yji + qjr(3)*zji
44 sc(7) = qir(1)*dj(1) + qir(2)*dj(2) + qir(3)*dj(3)
45 sc(8) = qjr(1)*di(1) + qjr(2)*di(2) + qjr(3)*di(3)
46 sc(9) = qir(1)*qjr(1) + qir(2)*qjr(2) + qir(3)*qjr(3)
47 sc(10) = qi(1)*qj(1) + qi(2)*qj(2) + qi(3)*qj(3) &
48 + qi(4)*qj(4) + qi(5)*qj(5) + qi(6)*qj(6) &
49 + qi(7)*qj(7) + qi(8)*qj(8) + qi(9)*qj(9)
50
51 ! calculate the gl functions for potential energy
52
53 gl(0) = ci*cj
54 gl(1) = cj*sc(3) - ci*sc(4)
55 gl(2) = ci*sc(6) + cj*sc(5) - sc(3)*sc(4)
56 gl(3) = sc(3)*sc(6) - sc(4)*sc(5)
57 gl(4) = sc(5)*sc(6)
58 gl(6) = sc(2)
59 gl(7) = 2.0d0 * (sc(7)-sc(8))
60 gl(8) = 2.0d0 * sc(10)
61 gl(5) = -4.0d0 * sc(9)
62
63 ! get the permanent multipole energy
64
65 e = rr1*gl(0) + rr3*(gl(1)+gl(6)) &
66 + rr5*(gl(2)+gl(7)+gl(8)) &
67 + rr7*(gl(3)+gl(5)) + rr9*gl(4)
68
69 ! intermediate variables for the multipole terms
70
71 gf(1) = rr3*gl(0) + rr5*(gl(1)+gl(6)) &
72 + rr7*(gl(2)+gl(7)+gl(8)) &
73 + rr9*(gl(3)+gl(5)) + rr11*gl(4)
74 gf(2) = -cj*rr3 + sc(4)*rr5 - sc(6)*rr7
75 gf(3) = ci*rr3 + sc(3)*rr5 + sc(5)*rr7
76 gf(4) = 2.0d0 * rr5
77 gf(5) = 2.0d0 * (-cj*rr5+sc(4)*rr7-sc(6)*rr9)
78 gf(6) = 2.0d0 * (-ci*rr5-sc(3)*rr7-sc(5)*rr9)
79 gf(7) = 4.0d0 * rr7
80
81 ! get the force
82
83 ftm2(1) = gf(1)*xji + gf(2)*di(1) + gf(3)*dj(1) &
84 + gf(4)*(qjdi(1)-qidj(1)) + gf(5)*qir(1) &
85 + gf(6)*qjr(1) + gf(7)*(qiqjr(1)+qjqir(1))
86 ftm2(2) = gf(1)*yji + gf(2)*di(2) + gf(3)*dj(2) &
87 + gf(4)*(qjdi(2)-qidj(2)) + gf(5)*qir(2) &
88 + gf(6)*qjr(2) + gf(7)*(qiqjr(2)+qjqir(2))
89 ftm2(3) = gf(1)*zji + gf(2)*di(3) + gf(3)*dj(3) &
90 + gf(4)*(qjdi(3)-qidj(3)) + gf(5)*qir(3) &
91 + gf(6)*qjr(3) + gf(7)*(qiqjr(3)+qjqir(3))
92
93 ! now perform the torque calculation
94
95 ! get the interaction torques
96
97 ttm2(1) = -rr3*dixdj(1) + gf(2)*dixr(1)-gf(5)*rxqir(1) &
98 + gf(4)*(dixqjr(1)+djxqir(1)+rxqidj(1)-2.0d0*qixqj(1))&
99 - gf(7)*(rxqijr(1)+qjrxqir(1))
100 ttm2(2) = -rr3*dixdj(2) + gf(2)*dixr(2)-gf(5)*rxqir(2) &
101 + gf(4)*(dixqjr(2)+djxqir(2)+rxqidj(2)-2.0d0*qixqj(2))&
102 - gf(7)*(rxqijr(2)+qjrxqir(2))
103 ttm2(3) = -rr3*dixdj(3) + gf(2)*dixr(3)-gf(5)*rxqir(3) &
104 + gf(4)*(dixqjr(3)+djxqir(3)+rxqidj(3)-2.0d0*qixqj(3))&
105 - gf(7)*(rxqijr(3)+qjrxqir(3))
106 ttm3(1) = rr3*dixdj(1) + gf(3)*djxr(1) -gf(6)*rxqjr(1) &
107 - gf(4)*(dixqjr(1)+djxqir(1)+rxqjdi(1)-2.0d0*qixqj(1))&
108 - gf(7)*(rxqjir(1)-qjrxqir(1))
109 ttm3(2) = rr3*dixdj(2) + gf(3)*djxr(2) -gf(6)*rxqjr(2) &
110 - gf(4)*(dixqjr(2)+djxqir(2)+rxqjdi(2)-2.0d0*qixqj(2))&
111 - gf(7)*(rxqjir(2)-qjrxqir(2))
112 ttm3(3) = rr3*dixdj(3) + gf(3)*djxr(3) -gf(6)*rxqjr(3) &
113 - gf(4)*(dixqjr(3)+djxqir(3)+rxqjdi(3)-2.0d0*qixqj(3))&
114 - gf(7)*(rxqjir(3)-qjrxqir(3))
115
116 ! update force and torque on site j
117
118 ftm1(1,j) = ftm1(1,j) + ftm2(1)
119 ftm1(2,j) = ftm1(2,j) + ftm2(2)
120 ftm1(3,j) = ftm1(3,j) + ftm2(3)
121 ttm1(1,j) = ttm1(1,j) + ttm3(1)
122 ttm1(2,j) = ttm1(2,j) + ttm3(2)
123 ttm1(3,j) = ttm1(3,j) + ttm3(3)
124
125 ! update force and torque on site i
126
127 ftm1(1,i) = ftm1(1,i) - ftm2(1)
128 ftm1(2,i) = ftm1(2,i) - ftm2(2)
129 ftm1(3,i) = ftm1(3,i) - ftm2(3)
130 ttm1(1,i) = ttm1(1,i) + ttm2(1)
131 ttm1(2,i) = ttm1(2,i) + ttm2(2)
132 ttm1(3,i) = ttm1(3,i) + ttm2(3)