ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/calc_LJ_FF.F90
(Generate patch)

Comparing trunk/OOPSE/libmdtools/calc_LJ_FF.F90 (file contents):
Revision 483 by gezelter, Wed Apr 9 04:06:43 2003 UTC vs.
Revision 900 by chuckv, Tue Jan 6 18:54:57 2004 UTC

# Line 2 | Line 2
2   !! Corresponds to the force field defined in lj_FF.cpp
3   !! @author Charles F. Vardeman II
4   !! @author Matthew Meineke
5 < !! @version $Id: calc_LJ_FF.F90,v 1.4 2003-04-09 04:06:43 gezelter Exp $, $Date: 2003-04-09 04:06:43 $, $Name: not supported by cvs2svn $, $Revision: 1.4 $
5 > !! @version $Id: calc_LJ_FF.F90,v 1.15 2004-01-06 18:54:57 chuckv Exp $, $Date: 2004-01-06 18:54:57 $, $Name: not supported by cvs2svn $, $Revision: 1.15 $
6  
7   module lj
8    use definitions
# Line 21 | Line 21 | module lj
21   #include "fForceField.h"
22  
23    integer, save :: LJ_Mixing_Policy
24 <  integer, save :: LJ_rcut
24 >  real(kind=DP), save :: LJ_rcut
25 >  logical, save :: havePolicy = .false., haveCut = .false.
26 >
27    
28    !! Logical has lj force field module been initialized?
29    
# Line 29 | Line 31 | module lj
31    
32    !! Public methods and data
33    public :: init_LJ_FF
34 <  public :: LJ_new_rcut
34 >  public :: setCutoffLJ
35    public :: do_lj_pair
36    
37    type :: lj_mixed_params
# Line 45 | Line 47 | module lj
47  
48       real ( kind = dp )  :: delta  = 0.0_dp
49  
50 +
51    end type lj_mixed_params
52    
53    type (lj_mixed_params), dimension(:,:), pointer :: ljMixed
54    
55   contains
56  
57 <  subroutine init_LJ_FF(mix_Policy, rcut, status)
57 >  subroutine init_LJ_FF(mix_Policy, status)
58      integer, intent(in) :: mix_Policy
59      integer, intent(out) :: status
60      integer :: myStatus
58    real(kind=dp) :: rcut
61      
62      if (mix_Policy == LB_MIXING_RULE) then
63         LJ_Mixing_Policy = LB_MIXING_RULE
# Line 68 | Line 70 | contains
70            return
71         endif
72      endif
71    
72    LJ_rcut = rcut
73  
74 <    status = 0
75 <    call createMixingList(myStatus)
76 <    if (myStatus /= 0) then
77 <       status = -1
78 <       return
74 >    havePolicy = .true.
75 >
76 >    if (haveCut) then
77 >       status = 0
78 >       call createMixingList(myStatus)
79 >       if (myStatus /= 0) then
80 >          status = -1
81 >          return
82 >       end if
83 >      
84 >       LJ_FF_initialized = .true.
85      end if
86 <    
81 <    LJ_FF_initialized = .true.
82 <    
86 >  
87    end subroutine init_LJ_FF
88    
89 <  subroutine LJ_new_rcut(rcut, status)
89 >  subroutine setCutoffLJ(rcut, status)
90      integer :: status, myStatus
91      real(kind=dp) :: rcut
92 +    
93 +    status = 0
94  
95      LJ_rcut = rcut
96 <    status = 0
91 <    call createMixingList(myStatus)
92 <    if (myStatus /= 0) then
93 <       status = -1
94 <       return
95 <    end if
96 >    haveCut = .true.
97  
98 +    if (havePolicy) then
99 +       status = 0
100 +       call createMixingList(myStatus)
101 +       if (myStatus /= 0) then
102 +          status = -1
103 +          return
104 +       end if
105 +      
106 +       LJ_FF_initialized = .true.
107 +    end if    
108 +    
109      return
110 <  end subroutine LJ_new_rcut
110 >  end subroutine setCutoffLJ
111    
112    subroutine createMixingList(status)
113      integer :: nAtypes
# Line 115 | Line 127 | contains
127          
128      if (.not. associated(ljMixed)) then
129         allocate(ljMixed(nAtypes, nAtypes))
130 <    else
119 <       status = -1
120 <       return
121 <    end if
130 >    endif
131  
132      rcut6 = LJ_rcut**6
133  
134 + ! This loops through all atypes, even those that don't support LJ forces.
135      do i = 1, nAtypes
136  
137         call getElementProperty(atypes, i, "lj_epsilon", myEpsilon_i)
# Line 129 | Line 139 | contains
139         ! do self mixing rule
140         ljMixed(i,i)%sigma   = mySigma_i
141        
142 <       ljMixed(i,i)%sigma6  = (ljMixed(i,i)%sigma) ** 6                                                                                                  
133 <       ljMixed(i,i)%tp6     = ljMixed(i,i)%sigma6/rcut6
142 >       ljMixed(i,i)%sigma6  = (ljMixed(i,i)%sigma) ** 6
143  
144 +       ljMixed(i,i)%tp6     = (ljMixed(i,i)%sigma6)/rcut6
145 +
146         ljMixed(i,i)%tp12    = (ljMixed(i,i)%tp6) ** 2
147  
148 +
149         ljMixed(i,i)%epsilon = myEpsilon_i
150  
151         ljMixed(i,i)%delta = -4.0_DP * ljMixed(i,i)%epsilon * &
# Line 181 | Line 193 | contains
193      integer, intent(in) ::  atom1, atom2
194      real( kind = dp ), intent(in) :: rij, r2
195      real( kind = dp ) :: pot
196 <    real( kind = dp ), dimension(3,getNlocal()) :: f    
196 >    real( kind = dp ), dimension(3,nLocal) :: f    
197      real( kind = dp ), intent(in), dimension(3) :: d
198      logical, intent(in) :: do_pot, do_stress
199  
# Line 195 | Line 207 | contains
207      real( kind = dp ) :: t6
208      real( kind = dp ) :: t12
209      real( kind = dp ) :: delta
210 +    integer :: id1, id2
211  
212  
213      if (rij.lt.LJ_rcut)  then
# Line 255 | Line 268 | contains
268        
269         if (do_stress) then
270  
271 <          if (molMembershipList(atom1) .ne. molMembershipList(atom2)) then
272 <             tau_Temp(1) = tau_Temp(1) + fx * d(1)
273 <             tau_Temp(2) = tau_Temp(2) + fx * d(2)
274 <             tau_Temp(3) = tau_Temp(3) + fx * d(3)
275 <             tau_Temp(4) = tau_Temp(4) + fy * d(1)
276 <             tau_Temp(5) = tau_Temp(5) + fy * d(2)
277 <             tau_Temp(6) = tau_Temp(6) + fy * d(3)
278 <             tau_Temp(7) = tau_Temp(7) + fz * d(1)
279 <             tau_Temp(8) = tau_Temp(8) + fz * d(2)
280 <             tau_Temp(9) = tau_Temp(9) + fz * d(3)
271 > #ifdef IS_MPI
272 >          id1 = tagRow(atom1)
273 >          id2 = tagColumn(atom2)
274 > #else
275 >          id1 = atom1
276 >          id2 = atom2
277 > #endif
278 >
279 >          if (molMembershipList(id1) .ne. molMembershipList(id2)) then
280 >
281 >             ! because the d vector is the rj - ri vector, and
282 >             ! because fx, fy, fz are the force on atom i, we need a
283 >             ! negative sign here:
284 >
285 >             tau_Temp(1) = tau_Temp(1) - d(1) * fx
286 >             tau_Temp(2) = tau_Temp(2) - d(1) * fy
287 >             tau_Temp(3) = tau_Temp(3) - d(1) * fz
288 >             tau_Temp(4) = tau_Temp(4) - d(2) * fx
289 >             tau_Temp(5) = tau_Temp(5) - d(2) * fy
290 >             tau_Temp(6) = tau_Temp(6) - d(2) * fz
291 >             tau_Temp(7) = tau_Temp(7) - d(3) * fx
292 >             tau_Temp(8) = tau_Temp(8) - d(3) * fy
293 >             tau_Temp(9) = tau_Temp(9) - d(3) * fz
294 >            
295               virial_Temp = virial_Temp + &
296                    (tau_Temp(1) + tau_Temp(5) + tau_Temp(9))
270          endif
297  
298 +          endif
299         endif
300        
301      endif
# Line 291 | Line 318 | contains
318      
319      if (present(status)) status = 0
320      select case (LJ_Mixing_Policy)
321 <    case (LB_MIXING_RULE)
321 >    case (1)
322         select case (thisParam)
323         case ("sigma")
324            myMixParam = 0.5_dp * (param1 + param2)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines