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

Comparing:
branches/mmeineke/OOPSE/libmdtools/do_Forces.F90 (file contents), Revision 377 by mmeineke, Fri Mar 21 17:42:12 2003 UTC vs.
trunk/OOPSE/libmdtools/do_Forces.F90 (file contents), Revision 726 by tim, Tue Aug 26 20:37:30 2003 UTC

# Line 4 | Line 4
4  
5   !! @author Charles F. Vardeman II
6   !! @author Matthew Meineke
7 < !! @version $Id: do_Forces.F90,v 1.1.1.1 2003-03-21 17:42:12 mmeineke Exp $, $Date: 2003-03-21 17:42:12 $, $Name: not supported by cvs2svn $, $Revision: 1.1.1.1 $
7 > !! @version $Id: do_Forces.F90,v 1.30 2003-08-26 20:37:30 tim Exp $, $Date: 2003-08-26 20:37:30 $, $Name: not supported by cvs2svn $, $Revision: 1.30 $
8  
9   module do_Forces
10    use force_globals
# Line 17 | Line 17 | module do_Forces
17    use dipole_dipole
18    use reaction_field
19    use gb_pair
20 +  use vector_class
21 +  use eam
22 +  use status
23   #ifdef IS_MPI
24    use mpiSimulation
25   #endif
# Line 27 | Line 30 | module do_Forces
30   #define __FORTRAN90
31   #include "fForceField.h"
32  
33 <  logical, save :: do_forces_initialized = .false.
33 >  logical, save :: do_forces_initialized = .false., haveRlist = .false.
34 >  logical, save :: havePolicies = .false.
35    logical, save :: FF_uses_LJ
36    logical, save :: FF_uses_sticky
37    logical, save :: FF_uses_dipoles
# Line 35 | Line 39 | module do_Forces
39    logical, save :: FF_uses_GB
40    logical, save :: FF_uses_EAM
41  
42 +  real(kind=dp), save :: rlist, rlistsq
43 +
44    public :: init_FF
45    public :: do_force_loop
46 +  public :: setRlistDF
47  
48 + #ifdef PROFILE
49 +  real(kind = dp) :: forceTime
50 +  real(kind = dp) :: forceTimeInitial, forceTimeFinal
51 +  real(kind = dp) :: globalForceTime
52 +  real(kind = dp) :: maxForceTime
53 +  integer, save :: nloops = 0
54 + #endif
55 +
56   contains
57  
58 +  subroutine setRlistDF( this_rlist )
59 +    
60 +    real(kind=dp) :: this_rlist
61 +
62 +    rlist = this_rlist
63 +    rlistsq = rlist * rlist
64 +    
65 +    haveRlist = .true.
66 +    if( havePolicies ) do_forces_initialized = .true.
67 +
68 +  end subroutine setRlistDF    
69 +
70    subroutine init_FF(LJMIXPOLICY, use_RF_c, thisStat)
71  
72      integer, intent(in) :: LJMIXPOLICY
# Line 87 | Line 114 | contains
114      !! check to make sure the FF_uses_RF setting makes sense
115      
116      if (FF_uses_dipoles) then
90       rrf = getRrf()
91       rt = getRt()      
92       call initialize_dipole(rrf, rt)
117         if (FF_uses_RF) then
118            dielect = getDielect()
119 <          call initialize_rf(rrf, rt, dielect)
119 >          call initialize_rf(dielect)
120         endif
121      else
122         if (FF_uses_RF) then          
# Line 100 | Line 124 | contains
124            thisStat = -1
125            return
126         endif
127 <    endif
127 >    endif
128  
129      if (FF_uses_LJ) then
130        
107       call getRcut(rcut)
108
131         select case (LJMIXPOLICY)
132         case (LB_MIXING_RULE)
133 <          call init_lj_FF(LB_MIXING_RULE, rcut, my_status)            
133 >          call init_lj_FF(LB_MIXING_RULE, my_status)            
134         case (EXPLICIT_MIXING_RULE)
135 <          call init_lj_FF(EXPLICIT_MIXING_RULE, rcut, my_status)
135 >          call init_lj_FF(EXPLICIT_MIXING_RULE, my_status)
136         case default
137            write(default_error,*) 'unknown LJ Mixing Policy!'
138            thisStat = -1
# Line 129 | Line 151 | contains
151            return
152         end if
153      endif
154 +
155 +
156 +    if (FF_uses_EAM) then
157 +       call init_EAM_FF(my_status)
158 +       if (my_status /= 0) then
159 +          thisStat = -1
160 +          return
161 +       end if
162 +    endif
163 +
164 +
165      
166      if (FF_uses_GB) then
167         call check_gb_pair_FF(my_status)
# Line 140 | Line 173 | contains
173  
174      if (FF_uses_GB .and. FF_uses_LJ) then
175      endif
176 +    if (.not. do_forces_initialized) then
177 +       !! Create neighbor lists
178 +       call expandNeighborList(getNlocal(), my_status)
179 +       if (my_Status /= 0) then
180 +          write(default_error,*) "SimSetup: ExpandNeighborList returned error."
181 +          thisStat = -1
182 +          return
183 +       endif
184 +    endif
185 +    
186  
187 +    havePolicies = .true.
188 +    if( haveRlist ) do_forces_initialized = .true.
189  
145    do_forces_initialized = .true.    
146
190    end subroutine init_FF
191    
192  
# Line 167 | Line 210 | contains
210      logical ( kind = 2) :: do_pot_c, do_stress_c
211      logical :: do_pot
212      logical :: do_stress
213 < #ifdef IS_MPI
213 > #ifdef IS_MPI
214      real( kind = DP ) :: pot_local
215      integer :: nrow
216      integer :: ncol
217 +    integer :: nprocs
218   #endif
219      integer :: nlocal
220      integer :: natoms    
221      logical :: update_nlist  
222      integer :: i, j, jbeg, jend, jnab
223      integer :: nlist
224 <    real( kind = DP ) ::  rijsq, rlistsq, rcutsq, rlist, rcut
224 >    real( kind = DP ) ::  rijsq
225      real(kind=dp),dimension(3) :: d
226      real(kind=dp) :: rfpot, mu_i, virial
227      integer :: me_i
# Line 186 | Line 230 | contains
230      integer :: listerror, error
231      integer :: localError
232  
233 +    real(kind=dp) :: listSkin = 1.0
234 +    
235 +
236      !! initialize local variables  
237  
238   #ifdef IS_MPI
239 +    pot_local = 0.0_dp
240      nlocal = getNlocal()
241      nrow   = getNrow(plan_row)
242      ncol   = getNcol(plan_col)
# Line 197 | Line 245 | contains
245      natoms = nlocal
246   #endif
247  
200    call getRcut(rcut,rc2=rcutsq)
201    call getRlist(rlist,rlistsq)
202    
248      call check_initialization(localError)
249      if ( localError .ne. 0 ) then
250 +       call handleError("do_force_loop","Not Initialized")
251         error = -1
252         return
253      end if
# Line 210 | Line 256 | contains
256      do_pot = do_pot_c
257      do_stress = do_stress_c
258  
259 +
260      ! Gather all information needed by all force loops:
261      
262   #ifdef IS_MPI    
# Line 226 | Line 273 | contains
273      endif
274      
275   #endif
276 <    
276 >
277 > !! Begin force loop timing:
278 > #ifdef PROFILE
279 >    call cpu_time(forceTimeInitial)
280 >    nloops = nloops + 1
281 > #endif
282 >  
283      if (FF_RequiresPrepairCalc() .and. SimRequiresPrepairCalc()) then
284         !! See if we need to update neighbor lists
285 <       call checkNeighborList(nlocal, q, rcut, rlist, update_nlist)  
285 >       call checkNeighborList(nlocal, q, listSkin, update_nlist)  
286         !! if_mpi_gather_stuff_for_prepair
287         !! do_prepair_loop_if_needed
288         !! if_mpi_scatter_stuff_from_prepair
289         !! if_mpi_gather_stuff_from_prepair_to_main_loop
290 <    else
291 <       !! See if we need to update neighbor lists
292 <       call checkNeighborList(nlocal, q, rcut, rlist, update_nlist)  
290 >    
291 > !--------------------PREFORCE LOOP----------->>>>>>>>>>>>>>>>>>>>>>>>>>>
292 > #ifdef IS_MPI
293 >    
294 >    if (update_nlist) then
295 >      
296 >       !! save current configuration, construct neighbor list,
297 >       !! and calculate forces
298 >       call saveNeighborList(nlocal, q)
299 >      
300 >       neighborListSize = size(list)
301 >       nlist = 0      
302 >      
303 >       do i = 1, nrow
304 >          point(i) = nlist + 1
305 >          
306 >          prepair_inner: do j = 1, ncol
307 >            
308 >             if (skipThisPair(i,j)) cycle prepair_inner
309 >            
310 >             call get_interatomic_vector(q_Row(:,i), q_Col(:,j), d, rijsq)
311 >            
312 >             if (rijsq < rlistsq) then            
313 >                
314 >                nlist = nlist + 1
315 >                
316 >                if (nlist > neighborListSize) then
317 >                   call expandNeighborList(nlocal, listerror)
318 >                   if (listerror /= 0) then
319 >                      error = -1
320 >                      write(DEFAULT_ERROR,*) "ERROR: nlist > list size and max allocations exceeded."
321 >                      return
322 >                   end if
323 >                   neighborListSize = size(list)
324 >                endif
325 >                
326 >                list(nlist) = j
327 >                call do_prepair(i, j, rijsq, d, do_pot, do_stress, u_l, A, f, t, pot_local)                      
328 >             endif
329 >          enddo prepair_inner
330 >       enddo
331 >
332 >       point(nrow + 1) = nlist + 1
333 >      
334 >    else  !! (of update_check)
335 >
336 >       ! use the list to find the neighbors
337 >       do i = 1, nrow
338 >          JBEG = POINT(i)
339 >          JEND = POINT(i+1) - 1
340 >          ! check thiat molecule i has neighbors
341 >          if (jbeg .le. jend) then
342 >            
343 >             do jnab = jbeg, jend
344 >                j = list(jnab)
345 >
346 >                call get_interatomic_vector(q_Row(:,i), q_Col(:,j), d, rijsq)
347 >                call do_prepair(i, j, rijsq, d, do_pot, do_stress, &
348 >                     u_l, A, f, t, pot_local)
349 >
350 >             enddo
351 >          endif
352 >       enddo
353      endif
354      
355 + #else
356 +    
357 +    if (update_nlist) then
358 +      
359 +       ! save current configuration, contruct neighbor list,
360 +       ! and calculate forces
361 +       call saveNeighborList(natoms, q)
362 +      
363 +       neighborListSize = size(list)
364 +  
365 +       nlist = 0
366 +
367 +       do i = 1, natoms-1
368 +          point(i) = nlist + 1
369 +          
370 +          prepair_inner: do j = i+1, natoms
371 +            
372 +             if (skipThisPair(i,j))  cycle prepair_inner
373 +                          
374 +             call get_interatomic_vector(q(:,i), q(:,j), d, rijsq)
375 +          
376 +
377 +             if (rijsq < rlistsq) then
378 +
379 +          
380 +                nlist = nlist + 1
381 +              
382 +                if (nlist > neighborListSize) then
383 +                   call expandNeighborList(natoms, listerror)
384 +                   if (listerror /= 0) then
385 +                      error = -1
386 +                      write(DEFAULT_ERROR,*) "ERROR: nlist > list size and max allocations exceeded."
387 +                      return
388 +                   end if
389 +                   neighborListSize = size(list)
390 +                endif
391 +                
392 +                list(nlist) = j
393 +                
394 +                call do_prepair(i, j, rijsq, d, do_pot, do_stress, &
395 +                        u_l, A, f, t, pot)
396 +                
397 +             endif
398 +          enddo prepair_inner
399 +       enddo
400 +      
401 +       point(natoms) = nlist + 1
402 +      
403 +    else !! (update)
404 +  
405 +       ! use the list to find the neighbors
406 +       do i = 1, natoms-1
407 +          JBEG = POINT(i)
408 +          JEND = POINT(i+1) - 1
409 +          ! check thiat molecule i has neighbors
410 +          if (jbeg .le. jend) then
411 +            
412 +             do jnab = jbeg, jend
413 +                j = list(jnab)
414 +
415 +                call get_interatomic_vector(q(:,i), q(:,j), d, rijsq)
416 +                call do_prepair(i, j, rijsq, d, do_pot, do_stress, &
417 +                     u_l, A, f, t, pot)
418 +
419 +             enddo
420 +          endif
421 +       enddo
422 +    endif    
423 + #endif
424 +    !! Do rest of preforce calculations
425 +    !! do necessary preforce calculations  
426 +    call do_preforce(nlocal,pot)
427 +   ! we have already updated the neighbor list set it to false...
428 +   update_nlist = .false.
429 +    else
430 +       !! See if we need to update neighbor lists for non pre-pair
431 +       call checkNeighborList(nlocal, q, listSkin, update_nlist)  
432 +    endif
433 +
434 +
435 +
436 +
437 +
438 + !---------------------------------MAIN Pair LOOP->>>>>>>>>>>>>>>>>>>>>>>>>>>>
439 +
440 +
441 +
442 +
443 +  
444   #ifdef IS_MPI
445      
446      if (update_nlist) then
447        
448         !! save current configuration, construct neighbor list,
449         !! and calculate forces
450 <       call saveNeighborList(q)
450 >       call saveNeighborList(nlocal, q)
451        
452         neighborListSize = size(list)
453         nlist = 0      
# Line 259 | Line 461 | contains
461              
462               call get_interatomic_vector(q_Row(:,i), q_Col(:,j), d, rijsq)
463              
464 <             if (rijsq <  rlistsq) then            
464 >             if (rijsq < rlistsq) then            
465                  
466                  nlist = nlist + 1
467                  
# Line 275 | Line 477 | contains
477                  
478                  list(nlist) = j
479                                  
480 <                if (rijsq <  rcutsq) then
481 <                   call do_pair(i, j, rijsq, d, do_pot, do_stress, &
482 <                        u_l, A, f, t,pot)
281 <                endif
480 >                call do_pair(i, j, rijsq, d, do_pot, do_stress, &
481 >                     u_l, A, f, t, pot_local)
482 >                
483               endif
484            enddo inner
485         enddo
# Line 299 | Line 500 | contains
500  
501                  call get_interatomic_vector(q_Row(:,i), q_Col(:,j), d, rijsq)
502                  call do_pair(i, j, rijsq, d, do_pot, do_stress, &
503 <                     u_l, A, f, t,pot)
503 >                     u_l, A, f, t, pot_local)
504  
505               enddo
506            endif
# Line 312 | Line 513 | contains
513        
514         ! save current configuration, contruct neighbor list,
515         ! and calculate forces
516 <       call saveNeighborList(q)
516 >       call saveNeighborList(natoms, q)
517        
518         neighborListSize = size(list)
519    
# Line 323 | Line 524 | contains
524            
525            inner: do j = i+1, natoms
526              
527 <             if (skipThisPair(i,j)) cycle inner
528 <            
527 >             if (skipThisPair(i,j))  cycle inner
528 >                          
529               call get_interatomic_vector(q(:,i), q(:,j), d, rijsq)
530            
531 <             if (rijsq <  rlistsq) then
531 >
532 >             if (rijsq < rlistsq) then
533                  
534                  nlist = nlist + 1
535                
# Line 343 | Line 545 | contains
545                  
546                  list(nlist) = j
547                  
548 <                if (rijsq <  rcutsq) then
549 <                   call do_pair(i, j, rijsq, d, do_pot, do_stress, &
550 <                        u_l, A, f, t,pot)
349 <                endif
548 >                call do_pair(i, j, rijsq, d, do_pot, do_stress, &
549 >                        u_l, A, f, t, pot)
550 >                
551               endif
552            enddo inner
553         enddo
# Line 367 | Line 568 | contains
568  
569                  call get_interatomic_vector(q(:,i), q(:,j), d, rijsq)
570                  call do_pair(i, j, rijsq, d, do_pot, do_stress, &
571 <                     u_l, A, f, t,pot)
571 >                     u_l, A, f, t, pot)
572  
573               enddo
574            endif
# Line 377 | Line 578 | contains
578   #endif
579      
580      ! phew, done with main loop.
581 <    
581 >
582 > !! Do timing
583 > #ifdef PROFILE
584 >    call cpu_time(forceTimeFinal)
585 >    forceTime = forceTime + forceTimeFinal - forceTimeInitial
586 > #endif
587 >
588 >
589   #ifdef IS_MPI
590      !!distribute forces
591 <    
592 <    call scatter(f_Row,f,plan_row3d)
591 >  
592 >    f_temp = 0.0_dp
593 >    call scatter(f_Row,f_temp,plan_row3d)
594 >    do i = 1,nlocal
595 >       f(1:3,i) = f(1:3,i) + f_temp(1:3,i)
596 >    end do
597 >
598 >    f_temp = 0.0_dp
599      call scatter(f_Col,f_temp,plan_col3d)
600      do i = 1,nlocal
601         f(1:3,i) = f(1:3,i) + f_temp(1:3,i)
602      end do
603      
604      if (FF_UsesDirectionalAtoms() .and. SimUsesDirectionalAtoms()) then
605 <       call scatter(t_Row,t,plan_row3d)
605 >       t_temp = 0.0_dp
606 >       call scatter(t_Row,t_temp,plan_row3d)
607 >       do i = 1,nlocal
608 >          t(1:3,i) = t(1:3,i) + t_temp(1:3,i)
609 >       end do
610 >       t_temp = 0.0_dp
611         call scatter(t_Col,t_temp,plan_col3d)
612        
613         do i = 1,nlocal
# Line 399 | Line 618 | contains
618      if (do_pot) then
619         ! scatter/gather pot_row into the members of my column
620         call scatter(pot_Row, pot_Temp, plan_row)
621 <      
621 >
622         ! scatter/gather pot_local into all other procs
623         ! add resultant to get total pot
624         do i = 1, nlocal
625            pot_local = pot_local + pot_Temp(i)
626         enddo
627 +      
628 +       pot_Temp = 0.0_DP
629  
409       pot_Temp = 0.0_DP
410
630         call scatter(pot_Col, pot_Temp, plan_col)
631         do i = 1, nlocal
632            pot_local = pot_local + pot_Temp(i)
633         enddo
634 <      
634 >
635      endif    
636   #endif
637  
# Line 460 | Line 679 | contains
679   #ifdef IS_MPI
680  
681      if (do_pot) then
682 <       pot = pot_local
682 >       pot = pot + pot_local
683         !! we assume the c code will do the allreduce to get the total potential
684         !! we could do it right here if we needed to...
685      endif
686  
687      if (do_stress) then
688 <       call mpi_allreduce(tau, tau_Temp,9,mpi_double_precision,mpi_sum, &
688 >      call mpi_allreduce(tau_Temp, tau, 9,mpi_double_precision,mpi_sum, &
689              mpi_comm_world,mpi_err)
690 <       call mpi_allreduce(virial, virial_Temp,1,mpi_double_precision,mpi_sum, &
690 >       call mpi_allreduce(virial_Temp, virial,1,mpi_double_precision,mpi_sum, &
691              mpi_comm_world,mpi_err)
692      endif
693  
# Line 480 | Line 699 | contains
699      endif
700  
701   #endif
702 <    
702 >
703 > #ifdef PROFILE
704 >    if (do_pot) then
705 >
706 > #ifdef IS_MPI
707 >
708 >      
709 >       call printCommTime()
710 >
711 >       call mpi_allreduce(forceTime,globalForceTime,1,MPI_DOUBLE_PRECISION, &
712 >            mpi_sum,mpi_comm_world,mpi_err)
713 >
714 >       call mpi_allreduce(forceTime,maxForceTime,1,MPI_DOUBLE_PRECISION, &
715 >            MPI_MAX,mpi_comm_world,mpi_err)
716 >      
717 >       call mpi_comm_size( MPI_COMM_WORLD, nprocs,mpi_err)
718 >      
719 >       if (getMyNode() == 0) then
720 >          write(*,*) "Total processor time spent in force calculations is: ", globalForceTime
721 >          write(*,*) "Total Time spent in force loop per processor is: ", globalforceTime/nprocs
722 >          write(*,*) "Maximum force time on any processor is: ", maxForceTime
723 >       end if
724 > #else
725 >       write(*,*) "Time spent in force loop is: ", forceTime
726 > #endif
727 >
728 >    
729 >    endif
730 >
731 > #endif
732 >
733 >
734 >
735    end subroutine do_force_loop
736  
737 <  subroutine do_pair(i, j, rijsq, d, do_pot, do_stress, u_l, A, f, t,pot)
737 >  subroutine do_pair(i, j, rijsq, d, do_pot, do_stress, u_l, A, f, t, pot)
738  
739      real( kind = dp ) :: pot
740 <    real( kind = dp ), dimension(:,:) :: u_l
741 <    real (kind=dp), dimension(:,:) :: A
742 <    real (kind=dp), dimension(:,:) :: f
743 <    real (kind=dp), dimension(:,:) :: t
740 >    real( kind = dp ), dimension(3,getNlocal()) :: u_l
741 >    real (kind=dp), dimension(9,getNlocal()) :: A
742 >    real (kind=dp), dimension(3,getNlocal()) :: f
743 >    real (kind=dp), dimension(3,getNlocal()) :: t
744  
745      logical, intent(inout) :: do_pot, do_stress
746      integer, intent(in) :: i, j
# Line 499 | Line 750 | contains
750      logical :: is_LJ_i, is_LJ_j
751      logical :: is_DP_i, is_DP_j
752      logical :: is_GB_i, is_GB_j
753 +    logical :: is_EAM_i,is_EAM_j
754      logical :: is_Sticky_i, is_Sticky_j
755      integer :: me_i, me_j
756  
757      r = sqrt(rijsq)
758  
759   #ifdef IS_MPI
760 +    if (tagRow(i) .eq. tagColumn(j)) then
761 +       write(0,*) 'do_pair is doing', i , j, tagRow(i), tagColumn(j)
762 +    endif
763  
764      me_i = atid_row(i)
765      me_j = atid_col(j)
# Line 529 | Line 784 | contains
784         call getElementProperty(atypes, me_j, "is_DP", is_DP_j)
785        
786         if ( is_DP_i .and. is_DP_j ) then
532          
787            call do_dipole_pair(i, j, d, r, rijsq, pot, u_l, f, t, &
788                 do_pot, do_stress)
535          
789            if (FF_uses_RF .and. SimUsesRF()) then
537            
790               call accumulate_rf(i, j, r, u_l)
791               call rf_correct_forces(i, j, d, r, u_l, f, do_stress)
540            
792            endif
793            
794         endif
# Line 547 | Line 798 | contains
798  
799         call getElementProperty(atypes, me_i, "is_Sticky", is_Sticky_i)
800         call getElementProperty(atypes, me_j, "is_Sticky", is_Sticky_j)
801 <      
801 >
802         if ( is_Sticky_i .and. is_Sticky_j ) then
803            call do_sticky_pair(i, j, d, r, rijsq, A, pot, f, t, &
804                 do_pot, do_stress)
# Line 557 | Line 808 | contains
808  
809      if (FF_uses_GB .and. SimUsesGB()) then
810  
811 +
812         call getElementProperty(atypes, me_i, "is_GB", is_GB_i)
813         call getElementProperty(atypes, me_j, "is_GB", is_GB_j)
814        
# Line 566 | Line 818 | contains
818         endif
819      endif
820      
821 +
822 +  
823 +   if (FF_uses_EAM .and. SimUsesEAM()) then
824 +      call getElementProperty(atypes, me_i, "is_EAM", is_EAM_i)
825 +      call getElementProperty(atypes, me_j, "is_EAM", is_EAM_j)
826 +      
827 +      if ( is_EAM_i .and. is_EAM_j ) &
828 +           call do_eam_pair(i, j, d, r, rijsq, pot, f, do_pot, do_stress)
829 +   endif
830 +
831 +
832 +
833 +
834    end subroutine do_pair
835 +
836 +
837 +
838 +  subroutine do_prepair(i, j, rijsq, d, do_pot, do_stress, u_l, A, f, t, pot)
839 +   real( kind = dp ) :: pot
840 +   real( kind = dp ), dimension(3,getNlocal()) :: u_l
841 +   real (kind=dp), dimension(9,getNlocal()) :: A
842 +   real (kind=dp), dimension(3,getNlocal()) :: f
843 +   real (kind=dp), dimension(3,getNlocal()) :: t
844 +  
845 +   logical, intent(inout) :: do_pot, do_stress
846 +   integer, intent(in) :: i, j
847 +   real ( kind = dp ), intent(inout)    :: rijsq
848 +   real ( kind = dp )                :: r
849 +   real ( kind = dp ), intent(inout) :: d(3)
850 +  
851 +   logical :: is_EAM_i, is_EAM_j
852 +  
853 +   integer :: me_i, me_j
854 +  
855 +   r = sqrt(rijsq)
856 +  
857  
858 + #ifdef IS_MPI
859 +   if (tagRow(i) .eq. tagColumn(j)) then
860 +      write(0,*) 'do_pair is doing', i , j, tagRow(i), tagColumn(j)
861 +   endif
862 +  
863 +   me_i = atid_row(i)
864 +   me_j = atid_col(j)
865 +  
866 + #else
867 +  
868 +   me_i = atid(i)
869 +   me_j = atid(j)
870 +  
871 + #endif
872 +    
873 +   if (FF_uses_EAM .and. SimUsesEAM()) then
874 +      call getElementProperty(atypes, me_i, "is_EAM", is_EAM_i)
875 +      call getElementProperty(atypes, me_j, "is_EAM", is_EAM_j)
876 +      
877 +      if ( is_EAM_i .and. is_EAM_j ) &
878 +           call calc_EAM_prepair_rho(i, j, d, r, rijsq )
879 +   endif
880  
881 + end subroutine do_prepair
882 +
883 +
884 +
885 +
886 +  subroutine do_preforce(nlocal,pot)
887 +    integer :: nlocal
888 +    real( kind = dp ) :: pot
889 +
890 +    if (FF_uses_EAM .and. SimUsesEAM()) then
891 +       call calc_EAM_preforce_Frho(nlocal,pot)
892 +    endif
893 +
894 +
895 +  end subroutine do_preforce
896 +  
897 +  
898    subroutine get_interatomic_vector(q_i, q_j, d, r_sq)
899      
900      real (kind = dp), dimension(3) :: q_i
901      real (kind = dp), dimension(3) :: q_j
902      real ( kind = dp ), intent(out) :: r_sq
903 <    real( kind = dp ) :: d(3)
904 <    real( kind = dp ) :: d_old(3)
905 <    d(1:3) = q_i(1:3) - q_j(1:3)
906 <    d_old = d
903 >    real( kind = dp ) :: d(3), scaled(3)
904 >    integer i
905 >
906 >    d(1:3) = q_j(1:3) - q_i(1:3)
907 >
908      ! Wrap back into periodic box if necessary
909      if ( SimUsesPBC() ) then
910 +      
911 +       if( .not.boxIsOrthorhombic ) then
912 +          ! calc the scaled coordinates.
913 +          
914 +          scaled = matmul(HmatInv, d)
915 +          
916 +          ! wrap the scaled coordinates
917  
918 <       d(1:3) = d(1:3) - box(1:3) * sign(1.0_dp,d(1:3)) * &
919 <            int(abs(d(1:3)/box(1:3)) + 0.5_dp)
918 >          scaled = scaled  - anint(scaled)
919 >          
920  
921 +          ! calc the wrapped real coordinates from the wrapped scaled
922 +          ! coordinates
923 +
924 +          d = matmul(Hmat,scaled)
925 +
926 +       else
927 +          ! calc the scaled coordinates.
928 +          
929 +          do i = 1, 3
930 +             scaled(i) = d(i) * HmatInv(i,i)
931 +            
932 +             ! wrap the scaled coordinates
933 +            
934 +             scaled(i) = scaled(i) - anint(scaled(i))
935 +            
936 +             ! calc the wrapped real coordinates from the wrapped scaled
937 +             ! coordinates
938 +
939 +             d(i) = scaled(i)*Hmat(i,i)
940 +          enddo
941 +       endif
942 +      
943      endif
944 +    
945      r_sq = dot_product(d,d)
946 <        
946 >    
947    end subroutine get_interatomic_vector
948 <
948 >  
949    subroutine check_initialization(error)
950      integer, intent(out) :: error
951      
952      error = 0
953      ! Make sure we are properly initialized.
954      if (.not. do_forces_initialized) then
955 +       write(*,*) "Forces not initialized"
956         error = -1
957         return
958      endif
# Line 642 | Line 1000 | contains
1000  
1001   #endif
1002  
1003 +
1004 +    if (FF_uses_EAM .and. SimUsesEAM()) then
1005 +       call clean_EAM()
1006 +    endif
1007 +
1008 +
1009 +
1010 +
1011 +
1012      rf = 0.0_dp
1013      tau_Temp = 0.0_dp
1014      virial_Temp = 0.0_dp
648    
1015    end subroutine zero_work_arrays
1016    
1017    function skipThisPair(atom1, atom2) result(skip_it)
652    
1018      integer, intent(in) :: atom1
1019      integer, intent(in), optional :: atom2
1020      logical :: skip_it
1021      integer :: unique_id_1, unique_id_2
1022 +    integer :: me_i,me_j
1023      integer :: i
1024  
1025      skip_it = .false.
# Line 671 | Line 1037 | contains
1037      !! in the normal loop, the atom numbers are unique
1038      unique_id_1 = atom1
1039   #endif
1040 <    
1040 >
1041      !! We were called with only one atom, so just check the global exclude
1042      !! list for this atom
1043      if (.not. present(atom2)) then
# Line 689 | Line 1055 | contains
1055   #else
1056      unique_id_2 = atom2
1057   #endif
1058 <    
1058 >
1059   #ifdef IS_MPI
1060      !! this situation should only arise in MPI simulations
1061      if (unique_id_1 == unique_id_2) then
# Line 699 | Line 1065 | contains
1065      
1066      !! this prevents us from doing the pair on multiple processors
1067      if (unique_id_1 < unique_id_2) then
1068 <       if (mod(unique_id_1 + unique_id_2,2) == 0) skip_it = .true.
1069 <       return
1068 >       if (mod(unique_id_1 + unique_id_2,2) == 0) then
1069 >          skip_it = .true.
1070 >          return
1071 >       endif
1072      else                
1073 <       if (mod(unique_id_1 + unique_id_2,2) == 1) skip_it = .true.
1074 <       return
1073 >       if (mod(unique_id_1 + unique_id_2,2) == 1) then
1074 >          skip_it = .true.
1075 >          return
1076 >       endif
1077      endif
1078   #endif
1079 <
1079 >
1080      !! the rest of these situations can happen in all simulations:
1081      do i = 1, nExcludes_global      
1082         if ((excludesGlobal(i) == unique_id_1) .or. &
# Line 715 | Line 1085 | contains
1085            return
1086         endif
1087      enddo
1088 <  
1088 >
1089      do i = 1, nExcludes_local
1090         if (excludesLocal(1,i) == unique_id_1) then
1091            if (excludesLocal(2,i) == unique_id_2) then
# Line 751 | Line 1121 | end module do_Forces
1121      doesit = FF_uses_RF
1122    end function FF_RequiresPostpairCalc
1123    
1124 + !! This cleans componets of force arrays belonging only to fortran
1125 +
1126   end module do_Forces

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines