ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/do_Forces.F90
(Generate patch)

Comparing trunk/OOPSE_old/src/mdtools/libmdCode/do_Forces.F90 (file contents):
Revision 298 by chuckv, Fri Mar 7 18:26:30 2003 UTC vs.
Revision 323 by gezelter, Wed Mar 12 15:39:01 2003 UTC

# Line 1 | Line 1
1 + !! do_Forces.F90
2 + !! module do_Forces
3   !! Calculates Long Range forces.
4 +
5   !! @author Charles F. Vardeman II
6   !! @author Matthew Meineke
7 < !! @version $Id: do_Forces.F90,v 1.5 2003-03-07 18:26:30 chuckv Exp $, $Date: 2003-03-07 18:26:30 $, $Name: not supported by cvs2svn $, $Revision: 1.5 $
7 > !! @version $Id: do_Forces.F90,v 1.12 2003-03-12 15:39:01 gezelter Exp $, $Date: 2003-03-12 15:39:01 $, $Name: not supported by cvs2svn $, $Revision: 1.12 $
8  
9  
10  
# Line 13 | Line 16 | module do_Forces
16    use neighborLists
17  
18    
19 <  use lj_FF
19 >  use lj
20    use sticky_FF
21 <  use dp_FF
21 >  use dipole_dipole
22    use gb_FF
23  
24   #ifdef IS_MPI
# Line 28 | Line 31 | contains
31  
32   contains
33  
34 < !! FORCE routine Calculates Lennard Jones forces.
35 < !------------------------------------------------------------->
34 >  !! Does force loop over i,j pairs. Calls do_pair to calculates forces.
35 >  !------------------------------------------------------------->
36    subroutine do_force_loop(q,A,mu,u_l,f,t,tau,potE,do_pot,FFerror)
37 < !! Position array provided by C, dimensioned by getNlocal
37 >    !! Position array provided by C, dimensioned by getNlocal
38      real ( kind = dp ), dimension(3,getNlocal()) :: q
39 <  !! Rotation Matrix for each long range particle in simulation.
39 >    !! Rotation Matrix for each long range particle in simulation.
40      real( kind = dp), dimension(9,getNlocal()) :: A
41 <
42 <  !! Magnitude dipole moment
41 >    
42 >    !! Magnitude dipole moment
43      real( kind = dp ), dimension(3,getNlocal()) :: mu
44 <  !! Unit vectors for dipoles (lab frame)
44 >    !! Unit vectors for dipoles (lab frame)
45      real( kind = dp ), dimension(3,getNlocal()) :: u_l
46 < !! Force array provided by C, dimensioned by getNlocal
46 >    !! Force array provided by C, dimensioned by getNlocal
47      real ( kind = dp ), dimension(3,getNlocal()) :: f
48 < !! Torsion array provided by C, dimensioned by getNlocal
48 >    !! Torsion array provided by C, dimensioned by getNlocal
49      real( kind = dp ), dimension(3,getNlocal()) :: t
50 <
51 < !! Stress Tensor
50 >    
51 >    !! Stress Tensor
52      real( kind = dp), dimension(9) :: tau
53 <
53 >    
54      real ( kind = dp ) :: potE
55      logical ( kind = 2) :: do_pot
56      integer :: FFerror
57  
58 + #ifdef IS_MPI
59 +    real( kind = DP ) :: pot_local
60 + #endif
61      
62 <    type(atype), pointer :: Atype_i
63 <    type(atype), pointer :: Atype_j
62 >    real( kind = DP )   :: pe
63 >    logical             :: update_nlist
64 >    
65  
66 +    integer ::  i, j, jbeg, jend, jnab, idim, jdim, idim2, jdim2, dim, dim2
67 +    integer :: nlist
68 +    integer :: j_start
69 +    
70 +    real( kind = DP ) ::  r_ij, pot, ftmp, dudr, d2, drdx1, kt1, kt2, kt3, ktmp
71 +    
72 +    real( kind = DP ) ::  rx_ij, ry_ij, rz_ij, rijsq
73 +    real( kind = DP ) ::  rlistsq, rcutsq, rlist, rcut
74  
75 <
61 <
62 <  
63 <
75 >    ! a rig that need to be fixed.
76   #ifdef IS_MPI
77 <  real( kind = DP ) :: pot_local
78 <
67 < !! Local arrays needed for MPI
68 <
69 < #endif
70 <
71 <
72 <
73 <  real( kind = DP )   :: pe
74 <  logical             :: update_nlist
75 <
76 <
77 <  integer ::  i, j, jbeg, jend, jnab, idim, jdim, idim2, jdim2, dim, dim2
78 <  integer :: nlist
79 <  integer :: j_start
80 <
81 <  real( kind = DP ) ::  r_ij, pot, ftmp, dudr, d2, drdx1, kt1, kt2, kt3, ktmp
82 <
83 <  real( kind = DP ) ::  rx_ij, ry_ij, rz_ij, rijsq
84 <  real( kind = DP ) ::  rlistsq, rcutsq,rlist,rcut
85 <
86 <  real( kind = DP ) :: dielectric = 0.0_dp
87 <
88 < ! a rig that need to be fixed.
89 < #ifdef IS_MPI
90 <  real( kind = dp ) :: pe_local
91 <  integer :: nlocal
77 >    real( kind = dp ) :: pe_local
78 >    integer :: nlocal
79   #endif
80 <  integer :: nrow
81 <  integer :: ncol
82 <  integer :: natoms
83 <  integer :: neighborListSize
84 <  integer :: listerror
85 < !! should we calculate the stress tensor
86 <  logical  :: do_stress = .false.
80 >    integer :: nrow
81 >    integer :: ncol
82 >    integer :: natoms
83 >    integer :: neighborListSize
84 >    integer :: listerror
85 >    !! should we calculate the stress tensor
86 >    logical  :: do_stress = .false.
87 >    FFerror = 0
88  
89 <
90 <  FFerror = 0
91 <
92 < ! Make sure we are properly initialized.
93 <  if (.not. isFFInit) then
94 <     write(default_error,*) "ERROR: lj_FF has not been properly initialized"
107 <     FFerror = -1
108 <     return
109 <  endif
89 >    ! Make sure we are properly initialized.
90 >    if (.not. isFFInit) then
91 >       write(default_error,*) "ERROR: lj_FF has not been properly initialized"
92 >       FFerror = -1
93 >       return
94 >    endif
95   #ifdef IS_MPI
96      if (.not. isMPISimSet()) then
97 <     write(default_error,*) "ERROR: mpiSimulation has not been properly initialized"
98 <     FFerror = -1
99 <     return
100 <  endif
97 >       write(default_error,*) "ERROR: mpiSimulation has not been properly initialized"
98 >       FFerror = -1
99 >       return
100 >    endif
101   #endif
102 <
103 < !! initialize local variables  
104 <  natoms = getNlocal()
105 <  call getRcut(rcut,rcut2=rcutsq)
106 <  call getRlist(rlist,rlistsq)
107 <
108 < !! Find ensemble
109 <  if (isEnsemble("NPT")) do_stress = .true.
110 < !! set to wrap
111 <  if (isPBC()) wrap = .true.
112 <
113 <
114 <
115 <  
116 < !! See if we need to update neighbor lists
132 <  call check(q,update_nlist)
133 <
134 < !--------------WARNING...........................
135 < ! Zero variables, NOTE:::: Forces are zeroed in C
136 < ! Zeroing them here could delete previously computed
137 < ! Forces.
138 < !------------------------------------------------
139 <  call zero_module_variables()
140 <
141 <
142 < ! communicate MPI positions
143 < #ifdef IS_MPI    
144 <    call gather(q,qRow,plan_row3d)
145 <    call gather(q,qCol,plan_col3d)
146 <
147 <    call gather(mu,muRow,plan_row3d)
148 <    call gather(mu,muCol,plan_col3d)
149 <
150 <    call gather(u_l,u_lRow,plan_row3d)
151 <    call gather(u_l,u_lCol,plan_col3d)
102 >    
103 >    !! initialize local variables  
104 >    natoms = getNlocal()
105 >    call getRcut(rcut,rcut2=rcutsq)
106 >    call getRlist(rlist,rlistsq)
107 >    
108 >    !! See if we need to update neighbor lists
109 >    call check(q, update_nlist)
110 >    
111 >    !--------------WARNING...........................
112 >    ! Zero variables, NOTE:::: Forces are zeroed in C
113 >    ! Zeroing them here could delete previously computed
114 >    ! Forces.
115 >    !------------------------------------------------
116 >    call zero_module_variables()
117  
118 <    call gather(A,ARow,plan_row_rotation)
119 <    call gather(A,ACol,plan_col_rotation)
118 >    ! communicate MPI positions
119 > #ifdef IS_MPI    
120 >    call gather(q,q_Row,plan_row3d)
121 >    call gather(q,q_Col,plan_col3d)
122 >    
123 >    call gather(u_l,u_l_Row,plan_row3d)
124 >    call gather(u_l,u_l_Col,plan_col3d)
125 >    
126 >    call gather(A,A_Row,plan_row_rotation)
127 >    call gather(A,A_Col,plan_col_rotation)
128   #endif
129  
130  
# Line 172 | Line 145 | contains
145        
146         do i = 1, nrow
147            point(i) = nlist + 1
175          Atype_i => identPtrListRow(i)%this
148            
149            inner: do j = 1, ncol
178             Atype_j => identPtrListColumn(j)%this
150              
151 <             call get_interatomic_vector(i,j,qRow(:,i),qCol(:,j),&
152 <                  rxij,ryij,rzij,rijsq,r)
153 <            
154 <             ! skip the loop if the atoms are identical
184 <             if (mpi_cycle_jLoop(i,j)) cycle inner:
185 <            
151 >             if (check_exclude(i,j)) cycle inner:
152 >
153 >             call get_interatomic_vector(q_Row(:,i), q_Col(:,j), d, rijsq)
154 >            
155               if (rijsq <  rlistsq) then            
156                  
157                  nlist = nlist + 1
# Line 197 | Line 166 | contains
166                  endif
167                  
168                  list(nlist) = j
169 <                
201 <                
169 >                                
170                  if (rijsq <  rcutsq) then
171 <                   call do_pair(Atype_i,Atype_j,i,j,r,rxij,ryij,rzij)
171 >                   call do_pair(i, j, rijsq, d)
172                  endif
173               endif
174            enddo inner
# Line 216 | Line 184 | contains
184            JEND = POINT(i+1) - 1
185            ! check thiat molecule i has neighbors
186            if (jbeg .le. jend) then
187 <
220 <             Atype_i => identPtrListRow(i)%this
187 >            
188               do jnab = jbeg, jend
189                  j = list(jnab)
190 <                Atype_j = identPtrListColumn(j)%this
191 <                call get_interatomic_vector(i,j,qRow(:,i),qCol(:,j),&
192 <                     rxij,ryij,rzij,rijsq,r)
193 <                
227 <                call do_pair(Atype_i,Atype_j,i,j,r,rxij,ryij,rzij)
190 >
191 >                call get_interatomic_vector(q_Row(:,i), q_Col(:,j), d, rijsq)
192 >                call do_pair(i, j, rijsq, d)
193 >
194               enddo
195            endif
196         enddo
# Line 240 | Line 206 | contains
206        
207         neighborListSize = getNeighborListSize()
208         nlist = 0
209 <      
244 <    
209 >          
210         do i = 1, natoms-1
211            point(i) = nlist + 1
247          Atype_i   => identPtrList(i)%this
212  
213            inner: do j = i+1, natoms
214 <             Atype_j   => identPtrList(j)%this
215 <             call get_interatomic_vector(i,j,q(:,i),q(:,j),&
216 <                  rxij,ryij,rzij,rijsq,r)
214 >
215 >             if (check_exclude(i,j)) cycle inner:
216 >
217 >             call get_interatomic_vector(q(:,i), q(:,j), d, rijsq)
218            
219               if (rijsq <  rlistsq) then
220 <
220 >                
221                  nlist = nlist + 1
222                  
223                  if (nlist > neighborListSize) then
# Line 265 | Line 230 | contains
230                  endif
231                  
232                  list(nlist) = j
233 <
269 <    
233 >                    
234                  if (rijsq <  rcutsq) then
235 <                   call do_pair(Atype_i,Atype_j,i,j,r,rxij,ryij,rzij)
235 >                   call do_pair(i, j, rijsq, d)
236                  endif
237               endif
238            enddo inner
# Line 285 | Line 249 | contains
249            ! check thiat molecule i has neighbors
250            if (jbeg .le. jend) then
251              
288             Atype_i => identPtrList(i)%this
252               do jnab = jbeg, jend
253                  j = list(jnab)
254 <                Atype_j = identPtrList(j)%this
255 <                call get_interatomic_vector(i,j,q(:,i),q(:,j),&
256 <                     rxij,ryij,rzij,rijsq,r)
257 <                call do_pair(Atype_i,Atype_j,i,j,r,rxij,ryij,rzij)
254 >
255 >                call get_interatomic_vector(q(:,i), q(:,j), d, rijsq)
256 >                call do_pair(i, j, rijsq, d)
257 >
258               enddo
259            endif
260         enddo
261      endif
262 <
262 >    
263   #endif
264 <
265 <
264 >    
265 >    
266   #ifdef IS_MPI
267      !! distribute all reaction field stuff (or anything for post-pair):
268      call scatter(rflRow,rflTemp1,plan_row3d)
# Line 308 | Line 271 | contains
271         rflTemp(1:3,i) = rflTemp1(1:3,i) + rflTemp2(1:3,i)
272      end do
273   #endif
274 <
274 >    
275   ! This is the post-pair loop:
276   #ifdef IS_MPI
277 <
277 >    
278      if (system_has_postpair_atoms) then
279         do i = 1, nlocal
280            Atype_i => identPtrListRow(i)%this
281            call do_postpair(i, Atype_i)
282         enddo
283      endif
284 <
284 >    
285   #else
286 <
286 >    
287      if (system_has_postpair_atoms) then
288         do i = 1, natoms
289            Atype_i => identPtr(i)%this
290            call do_postpair(i, Atype_i)
291         enddo
292      endif
293 <
293 >    
294   #endif
295 +    
296  
333
334
335
297   #ifdef IS_MPI
298      !!distribute forces
299  
300 <    call scatter(fRow,fTemp1,plan_row3d)
301 <    call scatter(fCol,fTemp2,plan_col3d)
341 <
342 <
300 >    call scatter(f_Row,f,plan_row3d)
301 >    call scatter(f_Col,f_temp,plan_col3d)
302      do i = 1,nlocal
303 <       fTemp(1:3,i) = fTemp1(1:3,i) + fTemp2(1:3,i)
303 >       f(1:3,i) = f(1:3,i) + f_temp(1:3,i)
304      end do
305  
306 <    if (do_torque) then
307 <       call scatter(tRow,tTemp1,plan_row3d)
308 <       call scatter(tCol,tTemp2,plan_col3d)
306 >    if (doTorque()) then
307 >       call scatter(t_Row,t,plan_row3d)
308 >       call scatter(t_Col,t_temp,plan_col3d)
309      
310         do i = 1,nlocal
311 <          tTemp(1:3,i) = tTemp1(1:3,i) + tTemp2(1:3,i)
311 >          t(1:3,i) = t(1:3,i) + t_temp(1:3,i)
312         end do
313      endif
314 <
314 >    
315      if (do_pot) then
316         ! scatter/gather pot_row into the members of my column
317 <       call scatter(eRow,eTemp,plan_row)
317 >       call scatter(pot_Row, pot_Temp, plan_row)
318        
319         ! scatter/gather pot_local into all other procs
320         ! add resultant to get total pot
321         do i = 1, nlocal
322 <          pe_local = pe_local + eTemp(i)
322 >          pot_local = pot_local + pot_Temp(i)
323         enddo
324  
325 <       eTemp = 0.0E0_DP
326 <       call scatter(eCol,eTemp,plan_col)
325 >       pot_Temp = 0.0_DP
326 >
327 >       call scatter(pot_Col, pot_Temp, plan_col)
328         do i = 1, nlocal
329 <          pe_local = pe_local + eTemp(i)
329 >          pot_local = pot_local + pot_Temp(i)
330         enddo
331        
332 <       pe = pe_local
332 >       pot = pot_local
333      endif
374 #else
375 ! Copy local array into return array for c
376    f = f+fTemp
377    t = t+tTemp
378 #endif
334  
335 <    potE = pe
335 >    if (doStress()) then
336 >       mpi_allreduce(tau, tau_Temp,9,mpi_double_precision,mpi_sum, &
337 >            mpi_comm_world,mpi_err)
338 >       mpi_allreduce(virial, virial_Temp,1,mpi_double_precision,mpi_sum, &
339 >            mpi_comm_world,mpi_err)
340 >    endif
341  
342 + #endif
343  
344 <    if (do_stress) then
345 < #ifdef IS_MPI
346 <       mpi_allreduce = (tau,tauTemp,9,mpi_double_precision,mpi_sum, &
386 <            mpi_comm_world,mpi_err)
387 < #else
388 <       tau = tauTemp
389 < #endif      
344 >    if (doStress()) then
345 >       tau = tau_Temp
346 >       virial = virial_Temp
347      endif
348  
349    end subroutine do_force_loop
350  
351  
395
396
397
398
399
400
401
402
352   !! Calculate any pre-force loop components and update nlist if necessary.
353    subroutine do_preForce(updateNlist)
354      logical, intent(inout) :: updateNlist
# Line 408 | Line 357 | contains
357  
358    end subroutine do_preForce
359  
411
412
413
414
415
416
417
418
419
420
421
422
360   !! Calculate any post force loop components, i.e. reaction field, etc.
361    subroutine do_postForce()
362  
# Line 427 | Line 364 | contains
364  
365    end subroutine do_postForce
366  
367 +  subroutine do_pair(i, j, rijsq, d)
368  
369 +    integer, intent(in) :: i, j
370 +    real ( kind = dp ), intent(in)    :: rijsq
371 +    real ( kind = dp )                :: r
372 +    real ( kind = dp ), intent(inout) :: d(3)
373  
374 +    r = sqrt(rijsq)
375 +    
376 +    logical :: is_LJ_i, is_LJ_j
377 +    logical :: is_DP_i, is_DP_j
378 +    logical :: is_Sticky_i, is_Sticky_j
379 +    integer :: me_i, me_j
380  
381 + #ifdef IS_MPI
382  
383 +    me_i = atid_row(i)
384 +    me_j = atid_col(j)
385  
386 + #else
387  
388 +    me_i = atid(i)
389 +    me_j = atid(j)
390  
391 + #endif
392  
393 +    call getElementProperty(atypes, me_i, "is_LJ", is_LJ_i)
394 +    call getElementProperty(atypes, me_j, "is_LJ", is_LJ_j)
395  
396 +    if ( is_LJ_i .and. is_LJ_j ) call do_lj_pair(i, j, d, r, rijsq, pot, f)
397  
398 +    call getElementProperty(atypes, me_i, "is_DP", is_DP_i)
399 +    call getElementProperty(atypes, me_j, "is_DP", is_DP_j)
400  
401 +    if ( is_DP_i .and. is_DP_j ) then
402  
403 +       call do_dipole_pair(i, j, d, r, pot, u_l, f, t)
404  
443
444
445
446  subroutine do_pair(atype_i,atype_j,i,j,r_ij,rx_ij,ry_ij,rz_ij)
447    type (atype ), pointer, intent(inout) :: atype_i
448    type (atype ), pointer, intent(inout) :: atype_j
449    integer :: i
450    integer :: j
451    real ( kind = dp ), intent(inout) :: rx_ij
452    real ( kind = dp ), intent(inout) :: ry_ij
453    real ( kind = dp ), intent(inout) :: rz_ij
454
455
456    real( kind = dp ) :: fx = 0.0_dp
457    real( kind = dp ) :: fy = 0.0_dp
458    real( kind = dp ) :: fz = 0.0_dp  
459  
460    real( kind = dp ) ::  drdx = 0.0_dp
461    real( kind = dp ) ::  drdy = 0.0_dp
462    real( kind = dp ) ::  drdz = 0.0_dp
463    
464
465    if (Atype_i%is_LJ .and. Atype_j%is_LJ) then
466       call getLJForce(r,pot,dudr,ljAtype_i,ljAtype_j,fx,fy,fz)
467    endif
468
469    if (Atype_i%is_dp .and. Atype_j%is_dp) then
470
471 #ifdef IS_MPI
472       call dipole_dipole(i, j, atype_i, atype_j, rx_ij, ry_ij, rz_ij, r_ij, &
473            ulRow(:,i), ulCol(:,j), rt, rrf, pot)
474 #else
475       call dipole_dipole(i, j, atype_i, atype_j, rx_ij, ry_ij, rz_ij, r_ij, &
476            ul(:,i), ul(:,j), rt, rrf, pot)
477 #endif
478
405         if (do_reaction_field) then
406 < #ifdef IS_MPI
481 <          call accumulate_rf(i, j, r_ij, rflRow(:,i), rflCol(:j), &
482 <               ulRow(:i), ulCol(:,j), rt, rrf)
483 < #else
484 <          call accumulate_rf(i, j, r_ij, rfl(:,i), rfl(:j), &
485 <               ul(:,i), ul(:,j), rt, rrf)
486 < #endif
406 >          call accumulate_rf(i, j, r)
407         endif
408  
489
409      endif
410  
411 <    if (Atype_i%is_sticky .and. Atype_j%is_sticky) then
412 <       call getstickyforce(r,pot,dudr,ljAtype_i,ljAtype_j)
411 >    call getElementProperty(atypes, me_i, "is_Sticky", is_Sticky_i)
412 >    call getElementProperty(atypes, me_j, "is_Sticky", is_Sticky_j)
413 >
414 >    if ( is_Sticky_i .and. is_Sticky_j ) then
415 >       call do_sticky_pair(i, j, d, r, rijsq, A, pot, f, t)
416      endif
417  
418 <      
497 < #ifdef IS_MPI
498 <                eRow(i) = eRow(i) + pot*0.5
499 <                eCol(i) = eCol(i) + pot*0.5
500 < #else
501 <                    pe = pe + pot
502 < #endif                
503 <            
504 <                drdx = -rxij / r
505 <                drdy = -ryij / r
506 <                drdz = -rzij / r
507 <                
508 <                fx = dudr * drdx
509 <                fy = dudr * drdy
510 <                fz = dudr * drdz
511 <
512 <
513 <
514 <
515 <
516 <
517 <                
518 < #ifdef IS_MPI
519 <                fCol(1,j) = fCol(1,j) - fx
520 <                fCol(2,j) = fCol(2,j) - fy
521 <                fCol(3,j) = fCol(3,j) - fz
522 <                
523 <                fRow(1,j) = fRow(1,j) + fx
524 <                fRow(2,j) = fRow(2,j) + fy
525 <                fRow(3,j) = fRow(3,j) + fz
526 < #else
527 <                fTemp(1,j) = fTemp(1,j) - fx
528 <                fTemp(2,j) = fTemp(2,j) - fy
529 <                fTemp(3,j) = fTemp(3,j) - fz
530 <                fTemp(1,i) = fTemp(1,i) + fx
531 <                fTemp(2,i) = fTemp(2,i) + fy
532 <                fTemp(3,i) = fTemp(3,i) + fz
533 < #endif
534 <                
535 <                if (do_stress) then
536 <                   tauTemp(1) = tauTemp(1) + fx * rxij
537 <                   tauTemp(2) = tauTemp(2) + fx * ryij
538 <                   tauTemp(3) = tauTemp(3) + fx * rzij
539 <                   tauTemp(4) = tauTemp(4) + fy * rxij
540 <                   tauTemp(5) = tauTemp(5) + fy * ryij
541 <                   tauTemp(6) = tauTemp(6) + fy * rzij
542 <                   tauTemp(7) = tauTemp(7) + fz * rxij
543 <                   tauTemp(8) = tauTemp(8) + fz * ryij
544 <                   tauTemp(9) = tauTemp(9) + fz * rzij
545 <                endif
546 <
547 <
548 <
418 >      
419    end subroutine do_pair
420  
421  
422 <
423 <
554 <
555 <
556 <
557 <
558 <
559 <
560 <
561 <
562 <
563 <
564 <
565 <
566 <  subroutine get_interatomic_vector(q_i,q_j,rx_ij,ry_ij,rz_ij,r_sq,r_ij)
567 < !---------------- Arguments-------------------------------
568 <   !! index i
569 <
570 <    !! Position array
422 >  subroutine get_interatomic_vector(q_i, q_j, d, r_sq)
423 >    
424      real (kind = dp), dimension(3) :: q_i
425      real (kind = dp), dimension(3) :: q_j
573    !! x component of vector between i and j
574    real ( kind = dp ), intent(out)  :: rx_ij
575    !! y component of vector between i and j
576    real ( kind = dp ), intent(out)  :: ry_ij
577    !! z component of vector between i and j
578    real ( kind = dp ), intent(out)  :: rz_ij
579    !! magnitude of r squared
426      real ( kind = dp ), intent(out) :: r_sq
581    !! magnitude of vector r between atoms i and j.
582    real ( kind = dp ), intent(out) :: r_ij
583    !! wrap into periodic box.
584    logical, intent(in) :: wrap
585
586 !--------------- Local Variables---------------------------
587    !! Distance between i and j
427      real( kind = dp ) :: d(3)
589 !---------------- END DECLARATIONS-------------------------
428  
591
592 ! Find distance between i and j
429      d(1:3) = q_i(1:3) - q_j(1:3)
430 <
431 < ! Wrap back into periodic box if necessary
432 <    if ( wrap ) then
430 >    
431 >    ! Wrap back into periodic box if necessary
432 >    if ( isPBC() ) then
433         d(1:3) = d(1:3) - thisSim%box(1:3) * sign(1.0_dp,thisSim%box(1:3)) * &
434              int(abs(d(1:3)/thisSim%box(1:3) + 0.5_dp)
435 <    end if
435 >    endif
436      
601 !   Find Magnitude of the vector
437      r_sq = dot_product(d,d)
438 <    r_ij = sqrt(r_sq)
604 <
605 < !   Set each component for force calculation
606 <    rx_ij = d(1)
607 <    ry_ij = d(2)
608 <    rz_ij = d(3)
609 <
610 <
438 >        
439    end subroutine get_interatomic_vector
440 <
440 >  
441    subroutine zero_module_variables()
442  
443   #ifndef IS_MPI
# Line 647 | Line 475 | contains
475  
476    end subroutine zero_module_variables
477  
478 < #ifdef IS_MPI
478 >
479   !! Function to properly build neighbor lists in MPI using newtons 3rd law.
480   !! We don't want 2 processors doing the same i j pair twice.
481   !! Also checks to see if i and j are the same particle.
482 <  function mpi_cycle_jLoop(i,j) result(do_cycle)
482 >  function checkExcludes(atom1,atom2) result(do_cycle)
483   !--------------- Arguments--------------------------
484   ! Index i
485 <    integer,intent(in) :: i
485 >    integer,intent(in) :: atom1
486   ! Index j
487 <    integer,intent(in) :: j
487 >    integer,intent(in), optional :: atom2
488   ! Result do_cycle
489      logical :: do_cycle
490   !--------------- Local variables--------------------
491      integer :: tag_i
492      integer :: tag_j
493 < !--------------- END DECLARATIONS------------------    
494 <    tag_i = tagRow(i)
493 >    integer :: i
494 > !--------------- END DECLARATIONS------------------  
495 >    do_cycle = .false.
496 >
497 > #ifdef IS_MPI
498 >    tag_i = tagRow(atom1)
499 > #else
500 >    tag_i = tag(atom1)
501 > #endif
502 >
503 > !! Check global excludes first
504 >    if (.not. present(atom2)) then
505 >       do i = 1,nGlobalExcludes
506 >          if (excludeGlobal(i) == tag_i) then
507 >             do_cycle = .true.
508 >             return
509 >          end if
510 >       end do
511 >       return !! return after checking globals
512 >    end if
513 >
514 > !! we return if j not present here.
515      tag_j = tagColumn(j)
516  
517 <    do_cycle = .false.
517 >
518  
519      if (tag_i == tag_j) then
520         do_cycle = .true.
# Line 679 | Line 527 | contains
527      else                
528         if (mod(tag_i + tag_j,2) == 1) do_cycle = .true.
529      endif
682  end function mpi_cycle_jLoop
683 #endif
530  
531 +
532 +
533 +    do i = 1, nLocalExcludes
534 +       if (tag_i = excludes(1,i) .and. excludes(2,i) < 0) then
535 +          do_cycle = .true.
536 +          return
537 +       end if
538 +    end do
539 +      
540 +
541 +  end function checkExcludes
542 +
543 +
544   end module do_Forces

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines