ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/calc_dipole_dipole.F90
Revision: 307
Committed: Mon Mar 10 19:37:48 2003 UTC (21 years, 6 months ago) by chuckv
File size: 4630 byte(s)
Log Message:
Changed names of calculation modules for do_Forces.

File Contents

# Content
1 module dipole_dipole
2
3 use simulation
4 use definitions
5 use forceGlobals
6 use atype_typedefs
7
8 contains
9
10 subroutine dipole_dipole(atom1, atom2, atype1, atype2, dx, dy, dz, rij, &
11 ul1, ul2, rt, rrf, pot)
12
13
14 integer atom1, atom2
15 double precision dx, dy, dz, rij
16 double precision dfact1, dfact2, dip2, r2, r3, r5, pre
17 double precision dudx, dudy, dudz, dudu1x, dudu1y, dudu1z
18 double precision dudu2x, dudu2y, dudu2z, rdotu1, rdotu2, u1dotu2
19 double precision taper, dtdr, vterm
20
21 real (kind = dp), dimension(3) :: ul1
22 real (kind = dp), dimension(3) :: ul2
23 type (atype), pointer :: atype1
24 type (atype), pointer :: atype2
25
26 ! pre converts from mu in units of debye to kcal/mol
27 pre = 14.38362d0
28
29 if (rij.le.rrf) then
30
31 if (rij.lt.rt) then
32 taper = 1.0d0
33 dtdr = 0.0d0
34 else
35 taper = (rrf + 2.0d0*rij - 3.0d0*rt)*(rrf-rij)**2/ ((rrf-rt)**3)
36 dtdr = 6.0d0*(rij*rij - rij*rt - rij*rrf +rrf*rt)/((rrf-rt)**3)
37 endif
38
39 r2 = rij*rij
40 r3 = r2*rij
41 r5 = r3*r2
42
43 rdotu1 = dx*ul1(1) + dy*ul1(2) + dz*ul1(3)
44 rdotu2 = dx*ul2(1) + dy*ul2(2) + dz*ul2(3)
45 u1dotu2 = ul1(1)*ul2(1) + ul1(2)*ul2(2) + ul1(3)*ul2(3)
46
47 dip2 = pre * atype1%dipole_moment * atype2%dipole_moment
48
49 dfact1 = 3.0d0*dip2 / r2
50 dfact2 = 3.0d0*dip2 / r5
51
52 vterm = dip2*((u1dotu2/r3) - 3.0d0*(rdotu1*rdotu2/r5))
53
54 pot = pot + vterm*taper
55
56 dudx = (-dfact1 * dx * ((u1dotu2/r3) - &
57 (5.0d0*(rdotu1*rdotu2)/r5)) - &
58 dfact2*(ul1(1)*rdotu2 + ul2(1)*rdotu1))*taper + &
59 vterm*dtdr*dx/rij
60
61 dudy = (-dfact1 * dy * ((u1dotu2/r3) - &
62 (5.0d0*(rdotu1*rdotu2)/r5)) - &
63 dfact2*(ul1(2)*rdotu2 + ul2(2)*rdotu1))*taper + &
64 vterm*dtdr*dy/rij
65
66 dudz = (-dfact1 * dz * ((u1dotu2/r3) - &
67 (5.0d0*(rdotu1*rdotu2)/r5)) - &
68 dfact2*(ul1(3)*rdotu2 + ul2(3)*rdotu1))*taper + &
69 vterm*dtdr*dz/rij
70
71 dudu1x = (dip2*((ul2(1)/r3) - (3.0d0*dx*rdotu2/r5)))*taper
72 dudu1y = (dip2*((ul2(2)/r3) - (3.0d0*dy*rdotu2/r5)))*taper
73 dudu1z = (dip2*((ul2(3)/r3) - (3.0d0*dz*rdotu2/r5)))*taper
74
75 dudu2x = (dip2*((ul1(1)/r3) - (3.0d0*dx*rdotu1/r5)))*taper
76 dudu2y = (dip2*((ul1(2)/r3) - (3.0d0*dy*rdotu1/r5)))*taper
77 dudu2z = (dip2*((ul1(3)/r3) - (3.0d0*dz*rdotu1/r5)))*taper
78
79
80 #ifdef IS_MPI
81 fRow(1,atom1) = fRow(1,atom1) + dudx
82 fRow(2,atom1) = fRow(2,atom1) + dudy
83 fRow(3,atom1) = fRow(3,atom1) + dudz
84
85 fCol(1,atom2) = fCol(1,atom2) - dudx
86 fCol(2,atom2) = fCol(2,atom2) - dudy
87 fCol(3,atom2) = fCol(3,atom2) - dudz
88
89 tRow(1,atom1) = tRow(1,atom1) - ul1(2)*dudu1z + ul1(3)*dudu1y
90 tRow(2,atom1) = tRow(2,atom1) - ul1(3)*dudu1x + ul1(1)*dudu1z
91 tRow(3,atom1) = tRow(3,atom1) - ul1(1)*dudu1y + ul1(2)*dudu1x
92
93 tCol(1,atom2) = tCol(1,atom2) - ul2(2)*dudu2z + ul2(3)*dudu2y
94 tCol(2,atom2) = tCol(2,atom2) - ul2(3)*dudu2x + ul2(1)*dudu2z
95 tCol(3,atom2) = tCol(3,atom2) - ul2(1)*dudu2y + ul2(2)*dudu2x
96 #else
97 fTemp(1,atom1) = fTemp(1,atom1) + dudx
98 fTemp(2,atom1) = fTemp(2,atom1) + dudy
99 fTemp(3,atom1) = fTemp(3,atom1) + dudz
100
101 fTemp(1,atom2) = fTemp(1,atom2) - dudx
102 fTemp(2,atom2) = fTemp(2,atom2) - dudy
103 fTemp(3,atom2) = fTemp(3,atom2) - dudz
104
105 tTemp(1,atom1) = tTemp(1,atom1) - ul1(2)*dudu1z + ul1(3)*dudu1y
106 tTemp(2,atom1) = tTemp(2,atom1) - ul1(3)*dudu1x + ul1(1)*dudu1z
107 tTemp(3,atom1) = tTemp(3,atom1) - ul1(1)*dudu1y + ul1(2)*dudu1x
108
109 tTemp(1,atom2) = tTemp(1,atom2) - ul2(2)*dudu2z + ul2(3)*dudu2y
110 tTemp(2,atom2) = tTemp(2,atom2) - ul2(3)*dudu2x + ul2(1)*dudu2z
111 tTemp(3,atom2) = tTemp(3,atom2) - ul2(1)*dudu2y + ul2(2)*dudu2x
112 #endif
113
114 if (do_stress) then
115 tauTemp(1) = tauTemp(1) + dudx * dx
116 tauTemp(2) = tauTemp(2) + dudx * dy
117 tauTemp(3) = tauTemp(3) + dudx * dz
118 tauTemp(4) = tauTemp(4) + dudy * dx
119 tauTemp(5) = tauTemp(5) + dudy * dy
120 tauTemp(6) = tauTemp(6) + dudy * dz
121 tauTemp(7) = tauTemp(7) + dudz * dx
122 tauTemp(8) = tauTemp(8) + dudz * dy
123 tauTemp(9) = tauTemp(9) + dudz * dz
124 virialTemp = virialTemp + ( tauTemp(1) + tauTemp(5) + tauTemp(9) )
125 endif
126
127 endif
128
129 return
130 end subroutine dipole_dipole
131
132 end module dipole_dipole