ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/Dipole_Dipole.F90
Revision: 302
Committed: Mon Mar 10 14:53:36 2003 UTC (21 years, 6 months ago) by gezelter
File size: 2956 byte(s)
Log Message:
Added stuff for Dipole/Dipole and ReactionField

File Contents

# Content
1 subroutine dipole_dipole(atom1, atom2, dx, dy, dz, rij, pot)
2
3 include 'sizes.inc'
4 include 'simulation.inc'
5
6 integer atom1, atom2
7 double precision dx, dy, dz, rij
8 double precision dfact1, dfact2, dip2, r2, r3, r5, pre
9 double precision dudx, dudy, dudz, dudu1x, dudu1y, dudu1z
10 double precision dudu2x, dudu2y, dudu2z, rdotu1, rdotu2, u1dotu2
11 double precision taper, dtdr, vterm
12
13 ! pre converts from mu in units of debye to kcal/mol
14
15 pre = 14.38362d0
16
17 if (rij.le.rrf) then
18
19 if (rij.lt.rt) then
20 taper = 1.0d0
21 dtdr = 0.0d0
22 else
23 taper = (rrf + 2.0d0*rij - 3.0d0*rt)*(rrf-rij)**2/ ((rrf-rt)**3)
24 dtdr = 6.0d0*(rij*rij - rij*rt - rij*rrf +rrf*rt)/((rrf-rt)**3)
25 endif
26
27 r2 = rij*rij
28 r3 = r2*rij
29 r5 = r3*r2
30
31 rdotu1 = dx*ulx(atom1) + dy*uly(atom1) + dz*ulz(atom1)
32 rdotu2 = dx*ulx(atom2) + dy*uly(atom2) + dz*ulz(atom2)
33 u1dotu2 = ulx(atom1)*ulx(atom2) + uly(atom1)*uly(atom2) + &
34 ulz(atom1)*ulz(atom2)
35
36 dip2 = pre*mu(atom1)*mu(atom2)
37
38 dfact1 = 3.0d0*dip2 / r2
39 dfact2 = 3.0d0*dip2 / r5
40
41 vterm = dip2*((u1dotu2/r3) - 3.0d0*(rdotu1*rdotu2/r5))
42
43 pot = pot + vterm*taper
44
45 dudx = (-dfact1 * dx * ((u1dotu2/r3) - &
46 (5.0d0*(rdotu1*rdotu2)/r5)) - &
47 dfact2*(ulx(atom1)*rdotu2 + ulx(atom2)*rdotu1))*taper + &
48 vterm*dtdr*dx/rij
49
50 dudy = (-dfact1 * dy * ((u1dotu2/r3) - &
51 (5.0d0*(rdotu1*rdotu2)/r5)) - &
52 dfact2*(uly(atom1)*rdotu2 + uly(atom2)*rdotu1))*taper + &
53 vterm*dtdr*dy/rij
54
55 dudz = (-dfact1 * dz * ((u1dotu2/r3) - &
56 (5.0d0*(rdotu1*rdotu2)/r5)) - &
57 dfact2*(ulz(atom1)*rdotu2 + ulz(atom2)*rdotu1))*taper + &
58 vterm*dtdr*dz/rij
59
60 dudu1x = (dip2*((ulx(atom2)/r3) - (3.0d0*dx*rdotu2/r5)))*taper
61 dudu1y = (dip2*((uly(atom2)/r3) - (3.0d0*dy*rdotu2/r5)))*taper
62 dudu1z = (dip2*((ulz(atom2)/r3) - (3.0d0*dz*rdotu2/r5)))*taper
63
64 dudu2x = (dip2*((ulx(atom1)/r3) - (3.0d0*dx*rdotu1/r5)))*taper
65 dudu2y = (dip2*((uly(atom1)/r3) - (3.0d0*dy*rdotu1/r5)))*taper
66 dudu2z = (dip2*((ulz(atom1)/r3) - (3.0d0*dz*rdotu1/r5)))*taper
67
68 flx(atom1) = flx(atom1) + dudx
69 fly(atom1) = fly(atom1) + dudy
70 flz(atom1) = flz(atom1) + dudz
71
72 flx(atom2) = flx(atom2) - dudx
73 fly(atom2) = fly(atom2) - dudy
74 flz(atom2) = flz(atom2) - dudz
75
76 tlx(atom1) = tlx(atom1) - uly(atom1)*dudu1z + ulz(atom1)*dudu1y
77 tly(atom1) = tly(atom1) - ulz(atom1)*dudu1x + ulx(atom1)*dudu1z
78 tlz(atom1) = tlz(atom1) - ulx(atom1)*dudu1y + uly(atom1)*dudu1x
79
80 tlx(atom2) = tlx(atom2) - uly(atom2)*dudu2z + ulz(atom2)*dudu2y
81 tly(atom2) = tly(atom2) - ulz(atom2)*dudu2x + ulx(atom2)*dudu2z
82 tlz(atom2) = tlz(atom2) - ulx(atom2)*dudu2y + uly(atom2)*dudu2x
83
84 virial = virial + ( dx*dudx + dy*dudy + dz*dudz )
85
86 endif
87
88 return
89 end subroutine dipole_dipole