ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/doForces.F90
(Generate patch)

Comparing trunk/OOPSE-4/src/UseTheForce/doForces.F90 (file contents):
Revision 2390 by chrisfen, Wed Oct 19 19:24:40 2005 UTC vs.
Revision 2402 by chrisfen, Tue Nov 1 19:09:30 2005 UTC

# Line 45 | Line 45
45  
46   !! @author Charles F. Vardeman II
47   !! @author Matthew Meineke
48 < !! @version $Id: doForces.F90,v 1.61 2005-10-19 19:24:29 chrisfen Exp $, $Date: 2005-10-19 19:24:29 $, $Name: not supported by cvs2svn $, $Revision: 1.61 $
48 > !! @version $Id: doForces.F90,v 1.64 2005-11-01 19:09:23 chrisfen Exp $, $Date: 2005-11-01 19:09:23 $, $Name: not supported by cvs2svn $, $Revision: 1.64 $
49  
50  
51   module doForces
# Line 644 | Line 644 | contains
644      integer, intent(out) :: thisStat  
645      integer :: my_status, nMatches
646      integer, pointer :: MatchList(:) => null()
647    real(kind=dp) :: rcut, rrf, rt, dielect
647  
648      !! assume things are copacetic, unless they aren't
649      thisStat = 0
# Line 744 | Line 743 | contains
743      integer :: nlist
744      real( kind = DP ) :: ratmsq, rgrpsq, rgrp, vpair, vij
745      real( kind = DP ) :: sw, dswdr, swderiv, mf
746 +    real( kind = DP ) :: rVal
747      real(kind=dp),dimension(3) :: d_atm, d_grp, fpair, fij
748      real(kind=dp) :: rfpot, mu_i, virial
749      integer :: me_i, me_j, n_in_i, n_in_j
# Line 754 | Line 754 | contains
754      integer :: propPack_i, propPack_j
755      integer :: loopStart, loopEnd, loop
756      integer :: iHash
757 +    integer :: i1
758    
759  
760      !! initialize local variables  
# Line 919 | Line 920 | contains
920                     inner: do jb = groupStartCol(j), groupStartCol(j+1)-1
921  
922                        atom2 = groupListCol(jb)
923 <
924 <                      if (skipThisPair(atom1, atom2)) cycle inner
925 <
923 >    
924 >                      if (skipThisPair(atom1, atom2))  cycle inner
925 >                      
926                        if ((n_in_i .eq. 1).and.(n_in_j .eq. 1)) then
927                           d_atm(1:3) = d_grp(1:3)
928                           ratmsq = rgrpsq
# Line 948 | Line 949 | contains
949                        else
950   #ifdef IS_MPI                      
951                           call do_pair(atom1, atom2, ratmsq, d_atm, sw, &
952 <                              do_pot, &
953 <                              eFrame, A, f, t, pot_local, vpair, fpair)
952 >                              do_pot, eFrame, A, f, t, pot_local, vpair, &
953 >                              fpair, d_grp, rgrp)
954   #else
955                           call do_pair(atom1, atom2, ratmsq, d_atm, sw, &
956 <                              do_pot,  &
957 <                              eFrame, A, f, t, pot, vpair, fpair)
956 >                              do_pot, eFrame, A, f, t, pot, vpair, fpair, &
957 >                              d_grp, rgrp)
958   #endif
959  
960                           vij = vij + vpair
# Line 1085 | Line 1086 | contains
1086   #endif
1087  
1088      if (SIM_requires_postpair_calc) then
1089 <      
1089 < #ifdef IS_MPI
1090 <       call scatter(rf_Row,rf,plan_atom_row_3d)
1091 <       call scatter(rf_Col,rf_Temp,plan_atom_col_3d)
1092 <       do i = 1,nlocal
1093 <          rf(1:3,i) = rf(1:3,i) + rf_Temp(1:3,i)
1094 <       end do
1095 < #endif
1096 <
1097 <       do i = 1, nLocal
1089 >       do i = 1, nlocal            
1090            
1091 <          rfpot = 0.0_DP
1092 < #ifdef IS_MPI
1093 <          me_i = atid_row(i)
1102 < #else
1091 >          ! we loop only over the local atoms, so we don't need row and column
1092 >          ! lookups for the types
1093 >          
1094            me_i = atid(i)
1104 #endif
1105          iHash = InteractionHash(me_i,me_j)
1095            
1096 +          ! is the atom electrostatic?  See if it would have an
1097 +          ! electrostatic interaction with itself
1098 +          iHash = InteractionHash(me_i,me_i)
1099 +
1100            if ( iand(iHash, ELECTROSTATIC_PAIR).ne.0 ) then
1101 + #ifdef IS_MPI
1102 +             call self_self(i, eFrame, pot_local(ELECTROSTATIC_POT), &
1103 +                  t, do_pot)
1104 + #else
1105 +             call self_self(i, eFrame, pot(ELECTROSTATIC_POT), &
1106 +                  t, do_pot)
1107 + #endif
1108 +          endif
1109 +  
1110 +          
1111 + !!$          if (electrostaticSummationMethod.eq.REACTION_FIELD) then
1112              
1113 <             mu_i = getDipoleMoment(me_i)
1113 >             ! loop over the excludes to accumulate RF stuff we've
1114 >             ! left out of the normal pair loop
1115              
1116 <             !! The reaction field needs to include a self contribution
1117 <             !! to the field:
1118 <             call accumulate_self_rf(i, mu_i, eFrame)
1119 <             !! Get the reaction field contribution to the
1120 <             !! potential and torques:
1121 <             call reaction_field_final(i, mu_i, eFrame, rfpot, t, do_pot)
1116 >             do i1 = 1, nSkipsForAtom(i)
1117 >                j = skipsForAtom(i, i1)
1118 >                
1119 >                ! prevent overcounting of the skips
1120 >                if (i.lt.j) then
1121 >                   call get_interatomic_vector(q(:,i), &
1122 >                        q(:,j), d_atm, ratmsq)
1123 >                   rVal = dsqrt(ratmsq)
1124 >                   call get_switch(ratmsq, sw, dswdr, rVal, group_switch, &
1125 >                        in_switching_region)
1126   #ifdef IS_MPI
1127 <             pot_local(ELECTROSTATIC_POT) = pot_local(ELECTROSTATIC_POT) + rfpot
1127 >                   call rf_self_excludes(i, j, sw, eFrame, d_atm, rVal, &
1128 >                        vpair, pot_local(ELECTROSTATIC_POT), f, t, do_pot)
1129   #else
1130 <             pot(ELECTROSTATIC_POT) = pot(ELECTROSTATIC_POT) + rfpot
1131 <            
1130 >                   call rf_self_excludes(i, j, sw, eFrame, d_atm, rVal, &
1131 >                        vpair, pot(ELECTROSTATIC_POT), f, t, do_pot)
1132   #endif
1133 <          endif
1133 >                endif
1134 >             enddo
1135 > !!$          endif
1136         enddo
1137      endif
1138      
1139   #ifdef IS_MPI
1140 <
1140 >    
1141      if (do_pot) then
1142 <       pot(1:LR_POT_TYPES) = pot(1:LR_POT_TYPES) &
1143 <            + pot_local(1:LR_POT_TYPES)
1132 <       !! we assume the c code will do the allreduce to get the total potential
1133 <       !! we could do it right here if we needed to...
1142 >       call mpi_allreduce(pot_local, pot, LR_POT_TYPES,mpi_double_precision,mpi_sum, &
1143 >            mpi_comm_world,mpi_err)            
1144      endif
1145 <
1145 >    
1146      if (do_stress) then
1147         call mpi_allreduce(tau_Temp, tau, 9,mpi_double_precision,mpi_sum, &
1148              mpi_comm_world,mpi_err)
1149         call mpi_allreduce(virial_Temp, virial,1,mpi_double_precision,mpi_sum, &
1150              mpi_comm_world,mpi_err)
1151      endif
1152 <
1152 >    
1153   #else
1154 <
1154 >    
1155      if (do_stress) then
1156         tau = tau_Temp
1157         virial = virial_Temp
1158      endif
1159 <
1159 >    
1160   #endif
1161 <
1161 >    
1162    end subroutine do_force_loop
1163  
1164    subroutine do_pair(i, j, rijsq, d, sw, do_pot, &
1165 <       eFrame, A, f, t, pot, vpair, fpair)
1165 >       eFrame, A, f, t, pot, vpair, fpair, d_grp, r_grp)
1166 > !!$  subroutine do_pair(i, j, rijsq, d, sw, do_pot, &
1167 > !!$       eFrame, A, f, t, pot, vpair, fpair, d_grp, r_grp, felec)
1168  
1169      real( kind = dp ) :: vpair, sw
1170      real( kind = dp ), dimension(LR_POT_TYPES) :: pot
1171      real( kind = dp ), dimension(3) :: fpair
1172 +    real( kind = dp ), dimension(3) :: felec
1173      real( kind = dp ), dimension(nLocal)   :: mfact
1174      real( kind = dp ), dimension(9,nLocal) :: eFrame
1175      real( kind = dp ), dimension(9,nLocal) :: A
# Line 1166 | Line 1179 | contains
1179      logical, intent(inout) :: do_pot
1180      integer, intent(in) :: i, j
1181      real ( kind = dp ), intent(inout) :: rijsq
1182 <    real ( kind = dp )                :: r
1182 >    real ( kind = dp ), intent(inout) :: r_grp
1183      real ( kind = dp ), intent(inout) :: d(3)
1184 +    real ( kind = dp ), intent(inout) :: d_grp(3)
1185 +    real ( kind = dp ) :: r
1186      integer :: me_i, me_j
1187  
1188      integer :: iHash
# Line 1185 | Line 1200 | contains
1200   #endif
1201  
1202      iHash = InteractionHash(me_i, me_j)
1203 <
1203 >    
1204      if ( iand(iHash, LJ_PAIR).ne.0 ) then
1205         call do_lj_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1206              pot(VDW_POT), f, do_pot)
1207      endif
1208 <
1208 >    
1209      if ( iand(iHash, ELECTROSTATIC_PAIR).ne.0 ) then
1210         call doElectrostaticPair(i, j, d, r, rijsq, sw, vpair, fpair, &
1211              pot(ELECTROSTATIC_POT), eFrame, f, t, do_pot)
1212 <
1213 <       if (electrostaticSummationMethod == REACTION_FIELD) then
1199 <
1200 <          ! CHECK ME (RF needs to know about all electrostatic types)
1201 <          call accumulate_rf(i, j, r, eFrame, sw)
1202 <          call rf_correct_forces(i, j, d, r, eFrame, sw, f, fpair)
1203 <       endif
1204 <
1212 > !!$       call doElectrostaticPair(i, j, d, r, rijsq, sw, vpair, fpair, &
1213 > !!$            pot(ELECTROSTATIC_POT), eFrame, f, t, do_pot, felec)
1214      endif
1215 <
1215 >    
1216      if ( iand(iHash, STICKY_PAIR).ne.0 ) then
1217         call do_sticky_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1218              pot(HB_POT), A, f, t, do_pot)
1219      endif
1220 <
1220 >    
1221      if ( iand(iHash, STICKYPOWER_PAIR).ne.0 ) then
1222         call do_sticky_power_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1223              pot(HB_POT), A, f, t, do_pot)
1224      endif
1225 <
1225 >    
1226      if ( iand(iHash, GAYBERNE_PAIR).ne.0 ) then
1227         call do_gb_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1228              pot(VDW_POT), A, f, t, do_pot)
# Line 1223 | Line 1232 | contains
1232         call do_gb_lj_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1233              pot(VDW_POT), A, f, t, do_pot)
1234      endif
1235 <
1235 >    
1236      if ( iand(iHash, EAM_PAIR).ne.0 ) then      
1237         call do_eam_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1238              pot(METALLIC_POT), f, do_pot)
1239      endif
1240 <
1240 >    
1241      if ( iand(iHash, SHAPE_PAIR).ne.0 ) then      
1242         call do_shape_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1243              pot(VDW_POT), A, f, t, do_pot)
1244      endif
1245 <
1245 >    
1246      if ( iand(iHash, SHAPE_LJ).ne.0 ) then      
1247         call do_shape_pair(i, j, d, r, rijsq, sw, vpair, fpair, &
1248              pot(VDW_POT), A, f, t, do_pot)
1249      endif
1250 <    
1250 >    
1251    end subroutine do_pair
1252  
1253    subroutine do_prepair(i, j, rijsq, d, sw, rcijsq, dc, &
# Line 1368 | Line 1377 | contains
1377      pot_Row = 0.0_dp
1378      pot_Col = 0.0_dp
1379      pot_Temp = 0.0_dp
1371
1372    rf_Row = 0.0_dp
1373    rf_Col = 0.0_dp
1374    rf_Temp = 0.0_dp
1380  
1381   #endif
1382  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines