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, 3 months ago) by gezelter
File size: 4511 byte(s)
Log Message:
Adding qpole

File Contents

# User Rev Content
1 gezelter 2748 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)