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 900 by chuckv, Tue Jan 6 18:54:57 2004 UTC vs.
Revision 1198 by tim, Thu May 27 00:48:12 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.15 2004-01-06 18:54:57 chuckv Exp $, $Date: 2004-01-06 18:54:57 $, $Name: not supported by cvs2svn $, $Revision: 1.15 $
5 > !! @version $Id: calc_LJ_FF.F90,v 1.21 2004-05-27 00:48:12 tim Exp $, $Date: 2004-05-27 00:48:12 $, $Name: not supported by cvs2svn $, $Revision: 1.21 $
6  
7   module lj
8    use definitions
9    use atype_module
10 +  use switcheroo
11    use vector_class
12    use simulation
13   #ifdef IS_MPI
# Line 22 | Line 23 | module lj
23  
24    integer, save :: LJ_Mixing_Policy
25    real(kind=DP), save :: LJ_rcut
26 <  logical, save :: havePolicy = .false., haveCut = .false.
27 <
26 >  logical, save :: havePolicy = .false.
27 >  logical, save :: haveCut = .false.
28 >  logical, save :: LJ_do_shift = .false.
29    
30    !! Logical has lj force field module been initialized?
31    
# Line 44 | Line 46 | module lj
46       !!
47       real ( kind = dp )  :: tp6
48       real ( kind = dp )  :: tp12
47
49       real ( kind = dp )  :: delta  = 0.0_dp
49
50
50    end type lj_mixed_params
51    
52    type (lj_mixed_params), dimension(:,:), pointer :: ljMixed
# Line 86 | Line 85 | contains
85    
86    end subroutine init_LJ_FF
87    
88 <  subroutine setCutoffLJ(rcut, status)
88 >  subroutine setCutoffLJ(rcut, do_shift, status)
89 >    logical, intent(in):: do_shift
90      integer :: status, myStatus
91      real(kind=dp) :: rcut
92 <    
92 >
93 > #define __FORTRAN90
94 > #include "fSwitchingFunction.h"
95 >
96      status = 0
97  
98      LJ_rcut = rcut
99 +    LJ_do_shift = do_shift
100 +    call set_switch(LJ_SWITCH, rcut, rcut)
101      haveCut = .true.
102  
103      if (havePolicy) then
# Line 188 | Line 193 | contains
193      
194    end subroutine createMixingList
195    
196 <  subroutine do_lj_pair(atom1, atom2, d, rij, r2, pot, f, do_pot, do_stress)
196 >  subroutine do_lj_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
197 >       pot, f, do_pot)
198  
199      integer, intent(in) ::  atom1, atom2
200      real( kind = dp ), intent(in) :: rij, r2
201 <    real( kind = dp ) :: pot
201 >    real( kind = dp ) :: pot, sw, vpair
202      real( kind = dp ), dimension(3,nLocal) :: f    
203      real( kind = dp ), intent(in), dimension(3) :: d
204 <    logical, intent(in) :: do_pot, do_stress
204 >    real( kind = dp ), intent(inout), dimension(3) :: fpair
205 >    logical, intent(in) :: do_pot
206  
207      ! local Variables
208      real( kind = dp ) :: drdx, drdy, drdz
# Line 209 | Line 216 | contains
216      real( kind = dp ) :: delta
217      integer :: id1, id2
218  
219 <
213 <    if (rij.lt.LJ_rcut)  then
214 <
215 <       ! Look up the correct parameters in the mixing matrix
219 >    ! Look up the correct parameters in the mixing matrix
220   #ifdef IS_MPI
221 <       sigma6   = ljMixed(atid_Row(atom1),atid_Col(atom2))%sigma6
222 <       epsilon  = ljMixed(atid_Row(atom1),atid_Col(atom2))%epsilon
223 <       delta    = ljMixed(atid_Row(atom1),atid_Col(atom2))%delta
221 >    sigma6   = ljMixed(atid_Row(atom1),atid_Col(atom2))%sigma6
222 >    epsilon  = ljMixed(atid_Row(atom1),atid_Col(atom2))%epsilon
223 >    delta    = ljMixed(atid_Row(atom1),atid_Col(atom2))%delta
224   #else
225 <       sigma6   = ljMixed(atid(atom1),atid(atom2))%sigma6
226 <       epsilon  = ljMixed(atid(atom1),atid(atom2))%epsilon
227 <       delta    = ljMixed(atid(atom1),atid(atom2))%delta
225 >    sigma6   = ljMixed(atid(atom1),atid(atom2))%sigma6
226 >    epsilon  = ljMixed(atid(atom1),atid(atom2))%epsilon
227 >    delta    = ljMixed(atid(atom1),atid(atom2))%delta
228   #endif
229 +
230 +    r6 = r2 * r2 * r2
231 +    
232 +    t6  = sigma6/ r6
233 +    t12 = t6 * t6    
234 +  
235 +    pot_temp = 4.0E0_DP * epsilon * (t12 - t6)
236 +    if (LJ_do_shift) then
237 +       pot_temp = pot_temp + delta
238 +    endif
239 +
240 +    vpair = vpair + pot_temp
241        
242 <       r6 = r2 * r2 * r2
242 >    dudr = sw * 24.0E0_DP * epsilon * (t6 - 2.0E0_DP*t12) / rij
243        
244 <       t6  = sigma6/ r6
245 <       t12 = t6 * t6    
246 <            
231 <       pot_temp = 4.0E0_DP * epsilon * (t12 - t6) + delta      
244 >    drdx = d(1) / rij
245 >    drdy = d(2) / rij
246 >    drdz = d(3) / rij
247        
248 <       dudr = 24.0E0_DP * epsilon * (t6 - 2.0E0_DP*t12) / rij
248 >    fx = dudr * drdx
249 >    fy = dudr * drdy
250 >    fz = dudr * drdz
251 >    
252        
235       drdx = d(1) / rij
236       drdy = d(2) / rij
237       drdz = d(3) / rij
238      
239       fx = dudr * drdx
240       fy = dudr * drdy
241       fz = dudr * drdz
242      
253   #ifdef IS_MPI
254 <       if (do_pot) then
255 <          pot_Row(atom1) = pot_Row(atom1) + pot_temp*0.5
256 <          pot_Col(atom2) = pot_Col(atom2) + pot_temp*0.5
257 <       endif
258 <
259 <       f_Row(1,atom1) = f_Row(1,atom1) + fx
260 <       f_Row(2,atom1) = f_Row(2,atom1) + fy
261 <       f_Row(3,atom1) = f_Row(3,atom1) + fz
262 <
263 <       f_Col(1,atom2) = f_Col(1,atom2) - fx
264 <       f_Col(2,atom2) = f_Col(2,atom2) - fy
265 <       f_Col(3,atom2) = f_Col(3,atom2) - fz      
266 <
254 >    if (do_pot) then
255 >       pot_Row(atom1) = pot_Row(atom1) + sw*pot_temp*0.5
256 >       pot_Col(atom2) = pot_Col(atom2) + sw*pot_temp*0.5
257 >    endif
258 >    
259 >    f_Row(1,atom1) = f_Row(1,atom1) + fx
260 >    f_Row(2,atom1) = f_Row(2,atom1) + fy
261 >    f_Row(3,atom1) = f_Row(3,atom1) + fz
262 >    
263 >    f_Col(1,atom2) = f_Col(1,atom2) - fx
264 >    f_Col(2,atom2) = f_Col(2,atom2) - fy
265 >    f_Col(3,atom2) = f_Col(3,atom2) - fz      
266 >    
267   #else
268 <       if (do_pot) pot = pot + pot_temp
268 >    if (do_pot) pot = pot + sw*pot_temp
269  
270 <       f(1,atom1) = f(1,atom1) + fx
271 <       f(2,atom1) = f(2,atom1) + fy
272 <       f(3,atom1) = f(3,atom1) + fz
273 <
274 <       f(1,atom2) = f(1,atom2) - fx
275 <       f(2,atom2) = f(2,atom2) - fy
276 <       f(3,atom2) = f(3,atom2) - fz
270 >    f(1,atom1) = f(1,atom1) + fx
271 >    f(2,atom1) = f(2,atom1) + fy
272 >    f(3,atom1) = f(3,atom1) + fz
273 >    
274 >    f(1,atom2) = f(1,atom2) - fx
275 >    f(2,atom2) = f(2,atom2) - fy
276 >    f(3,atom2) = f(3,atom2) - fz
277   #endif
278 <      
269 <       if (do_stress) then
270 <
278 >        
279   #ifdef IS_MPI
280 <          id1 = tagRow(atom1)
281 <          id2 = tagColumn(atom2)
280 >    id1 = AtomRowToGlobal(atom1)
281 >    id2 = AtomColToGlobal(atom2)
282   #else
283 <          id1 = atom1
284 <          id2 = atom2
283 >    id1 = atom1
284 >    id2 = atom2
285   #endif
286  
287 <          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))
297 <
298 <          endif
299 <       endif
287 >    if (molMembershipList(id1) .ne. molMembershipList(id2)) then
288        
289 +       fpair(1) = fpair(1) + fx
290 +       fpair(2) = fpair(2) + fy
291 +       fpair(3) = fpair(3) + fz
292 +
293      endif
294 +
295      return    
296 <      
296 >    
297    end subroutine do_lj_pair
298 <
299 <
298 >  
299 >  
300    !! Calculates the mixing for sigma or epslon
301 <
301 >  
302    function calcLJMix(thisParam,param1,param2,status) result(myMixParam)
303      character(len=*) :: thisParam
304      real(kind = dp)  :: param1

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines