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

Comparing trunk/OOPSE-4/src/UseTheForce/DarkSide/gb.F90 (file contents):
Revision 2378 by gezelter, Mon Oct 17 21:47:45 2005 UTC vs.
Revision 2926 by gezelter, Fri Jul 7 19:44:54 2006 UTC

# Line 46 | Line 46 | module gayberne
46    use simulation
47    use atype_module
48    use vector_class
49 +  use linearalgebra
50    use status
51    use lj
52 +  use fForceOptions
53   #ifdef IS_MPI
54    use mpiSimulation
55   #endif
# Line 59 | Line 61 | module gayberne
61   #define __FORTRAN90
62   #include "UseTheForce/DarkSide/fInteractionMap.h"
63  
64 +  logical, save :: haveGBMap = .false.
65 +  logical, save :: haveMixingMap = .false.
66 +  real(kind=dp), save :: mu = 2.0_dp
67 +  real(kind=dp), save :: nu = 1.0_dp
68 +
69 +
70    public :: newGBtype
71 +  public :: complete_GB_FF
72    public :: do_gb_pair
64  public :: do_gb_lj_pair
73    public :: getGayBerneCut
74    public :: destroyGBtypes
75  
76    type :: GBtype
77       integer          :: atid
78 <     real(kind = dp ) :: sigma
79 <     real(kind = dp ) :: l2b_ratio
78 >     real(kind = dp ) :: d
79 >     real(kind = dp ) :: l
80       real(kind = dp ) :: eps
81       real(kind = dp ) :: eps_ratio
82 <     real(kind = dp ) :: mu
83 <     real(kind = dp ) :: nu
76 <     real(kind = dp ) :: sigma_l
77 <     real(kind = dp ) :: eps_l
82 >     real(kind = dp ) :: dw
83 >     logical          :: isLJ
84    end type GBtype
85 <
85 >  
86    type, private :: GBList
87       integer               :: nGBtypes = 0
88       integer               :: currentGBtype = 0
89       type(GBtype), pointer :: GBtypes(:)      => null()
90       integer, pointer      :: atidToGBtype(:) => null()
91    end type GBList
92 <
92 >  
93    type(GBList), save :: GBMap
94 <
94 >  
95 >  type :: GBMixParameters
96 >     real(kind=DP) :: sigma0
97 >     real(kind=DP) :: eps0
98 >     real(kind=DP) :: dw
99 >     real(kind=DP) :: x2
100 >     real(kind=DP) :: xa2
101 >     real(kind=DP) :: xai2
102 >     real(kind=DP) :: xp2
103 >     real(kind=DP) :: xpap2
104 >     real(kind=DP) :: xpapi2
105 >  end type GBMixParameters
106 >  
107 >  type(GBMixParameters), dimension(:,:), allocatable :: GBMixingMap
108 >  
109   contains
110 <
111 <  subroutine newGBtype(c_ident, sigma, l2b_ratio, eps, eps_ratio, mu, nu, &
92 <       status)
110 >  
111 >  subroutine newGBtype(c_ident, d, l, eps, eps_ratio, dw, status)
112      
113      integer, intent(in) :: c_ident
114 <    real( kind = dp ), intent(in) :: sigma, l2b_ratio, eps, eps_ratio
96 <    real( kind = dp ), intent(in) :: mu, nu
114 >    real( kind = dp ), intent(in) :: d, l, eps, eps_ratio, dw
115      integer, intent(out) :: status
116 <
117 <    integer :: nGBTypes, ntypes, myATID
116 >    
117 >    integer :: nGBTypes, nLJTypes, ntypes, myATID
118      integer, pointer :: MatchList(:) => null()
119      integer :: current, i
120      status = 0
121 <
121 >    
122      if (.not.associated(GBMap%GBtypes)) then
123 <                              
123 >      
124         call getMatchingElementList(atypes, "is_GayBerne", .true., &
125              nGBtypes, MatchList)
126        
127 <       GBMap%nGBtypes = nGBtypes
128 <
129 <       allocate(GBMap%GBtypes(nGBtypes))
130 <
127 >       call getMatchingElementList(atypes, "is_LennardJones", .true., &
128 >            nLJTypes, MatchList)
129 >      
130 >       GBMap%nGBtypes = nGBtypes + nLJTypes
131 >      
132 >       allocate(GBMap%GBtypes(nGBtypes + nLJTypes))
133 >      
134         ntypes = getSize(atypes)
135        
136 <       allocate(GBMap%atidToGBtype(ntypes))
136 >       allocate(GBMap%atidToGBtype(ntypes))      
137 >    endif
138 >    
139 >    GBMap%currentGBtype = GBMap%currentGBtype + 1
140 >    current = GBMap%currentGBtype
141 >    
142 >    myATID = getFirstMatchingElement(atypes, "c_ident", c_ident)
143 >    
144 >    GBMap%atidToGBtype(myATID)       = current
145 >    GBMap%GBtypes(current)%atid      = myATID
146 >    GBMap%GBtypes(current)%d         = d
147 >    GBMap%GBtypes(current)%l         = l
148 >    GBMap%GBtypes(current)%eps       = eps
149 >    GBMap%GBtypes(current)%eps_ratio = eps_ratio
150 >    GBMap%GBtypes(current)%dw        = dw
151 >    GBMap%GBtypes(current)%isLJ      = .false.
152 >    
153 >    return
154 >  end subroutine newGBtype
155 >  
156 >  subroutine complete_GB_FF(status)
157 >    integer :: status
158 >    integer :: i, j, l, m, lm, function_type
159 >    real(kind=dp) :: thisDP, sigma
160 >    integer :: alloc_stat, iTheta, iPhi, nSteps, nAtypes, myATID, current
161 >    logical :: thisProperty
162 >    
163 >    status = 0
164 >    if (GBMap%currentGBtype == 0) then
165 >       call handleError("complete_GB_FF", "No members in GBMap")
166 >       status = -1
167 >       return
168 >    end if
169 >    
170 >    nAtypes = getSize(atypes)
171 >    
172 >    if (nAtypes == 0) then
173 >       status = -1
174 >       return
175 >    end if
176 >    
177 >    ! atypes comes from c side
178 >    do i = 1, nAtypes
179        
180 <       !! initialize atidToGBtype to -1 so that we can use this
181 <       !! array to figure out which atom comes first in the GBLJ
182 <       !! routine
180 >       myATID = getFirstMatchingElement(atypes, 'c_ident', i)
181 >       call getElementProperty(atypes, myATID, "is_LennardJones", thisProperty)
182 >      
183 >       if (thisProperty) then
184 >          GBMap%currentGBtype = GBMap%currentGBtype + 1
185 >          current = GBMap%currentGBtype
186 >          
187 >          GBMap%atidToGBtype(myATID) = current
188 >          GBMap%GBtypes(current)%atid      = myATID      
189 >          GBMap%GBtypes(current)%isLJ      = .true.          
190 >          GBMap%GBtypes(current)%d         = getSigma(myATID)
191 >          GBMap%GBtypes(current)%l         = GBMap%GBtypes(current)%d
192 >          GBMap%GBtypes(current)%eps       = getEpsilon(myATID)
193 >          GBMap%GBtypes(current)%eps_ratio = 1.0_dp
194 >          GBMap%GBtypes(current)%dw        = 1.0_dp
195 >          
196 >       endif
197 >      
198 >    end do
199 >    
200 >    haveGBMap = .true.
201  
202 <       do i = 1, ntypes
203 <          GBMap%atidToGBtype(i) = -1
123 <       enddo
202 >    
203 >  end subroutine complete_GB_FF
204  
205 +  subroutine createGBMixingMap()
206 +    integer :: nGBtypes, i, j
207 +    real (kind = dp) :: d1, l1, e1, er1, dw1
208 +    real (kind = dp) :: d2, l2, e2, er2, dw2
209 +    real (kind = dp) :: er, ermu, xp, ap2
210 +
211 +    if (GBMap%currentGBtype == 0) then
212 +       call handleError("GB", "No members in GBMap")
213 +       return
214 +    end if
215 +    
216 +    nGBtypes = GBMap%nGBtypes
217 +
218 +    if (.not. allocated(GBMixingMap)) then
219 +       allocate(GBMixingMap(nGBtypes, nGBtypes))
220      endif
221  
222 <    GBMap%currentGBtype = GBMap%currentGBtype + 1
128 <    current = GBMap%currentGBtype
222 >    do i = 1, nGBtypes
223  
224 <    myATID = getFirstMatchingElement(atypes, "c_ident", c_ident)
225 <    GBMap%atidToGBtype(myATID)        = current
226 <    GBMap%GBtypes(current)%atid       = myATID
227 <    GBMap%GBtypes(current)%sigma      = sigma
228 <    GBMap%GBtypes(current)%l2b_ratio  = l2b_ratio
135 <    GBMap%GBtypes(current)%eps        = eps
136 <    GBMap%GBtypes(current)%eps_ratio  = eps_ratio
137 <    GBMap%GBtypes(current)%mu         = mu
138 <    GBMap%GBtypes(current)%nu         = nu
139 <    GBMap%GBtypes(current)%sigma_l    = sigma*l2b_ratio
140 <    GBMap%GBtypes(current)%eps_l      = eps*eps_ratio
224 >       d1 = GBMap%GBtypes(i)%d
225 >       l1 = GBMap%GBtypes(i)%l
226 >       e1 = GBMap%GBtypes(i)%eps
227 >       er1 = GBMap%GBtypes(i)%eps_ratio
228 >       dw1 = GBMap%GBtypes(i)%dw
229  
230 <    return
143 <  end subroutine newGBtype
230 >       do j = i, nGBtypes
231  
232 +          d2 = GBMap%GBtypes(j)%d
233 +          l2 = GBMap%GBtypes(j)%l
234 +          e2 = GBMap%GBtypes(j)%eps
235 +          er2 = GBMap%GBtypes(j)%eps_ratio
236 +          dw2 = GBMap%GBtypes(j)%dw
237 + !         write(*,*) 'd2 = ', d2,l2, d1,l2
238 + !          GBMixingMap(i,j)%sigma0 = sqrt(d1*d1 + d2*d2)
239 +          GBMixingMap(i,j)%sigma0 = 0.5_dp*(d1 + d2)
240 +          GBMixingMap(i,j)%xa2 = (l1*l1 - d1*d1)/(l1*l1 + d2*d2)
241 +          GBMixingMap(i,j)%xai2 = (l2*l2 - d2*d2)/(l2*l2 + d1*d1)
242 +          GBMixingMap(i,j)%x2 = (l1*l1 - d1*d1) * (l2*l2 - d2*d2) / &
243 +               ((l2*l2 + d1*d1) * (l1*l1 + d2*d2))
244 +
245 +          ! assumed LB mixing rules for now:
246 +
247 +          GBMixingMap(i,j)%dw = 0.5_dp * (dw1 + dw2)
248 +          GBMixingMap(i,j)%eps0 = sqrt(e1 * e2)
249 +
250 +          er = sqrt(er1 * er2)
251 +          ermu = er**(1.0_dp / mu)
252 +          xp = (1.0_dp - ermu) / (1.0_dp + ermu)
253 +          ap2 = 1.0_dp / (1.0_dp + ermu)
254 +
255 +          GBMixingMap(i,j)%xp2 = xp*xp
256 +          GBMixingMap(i,j)%xpap2 = xp*ap2
257 +          GBMixingMap(i,j)%xpapi2 = xp/ap2
258 +          
259 +          if (i.ne.j) then
260 +             GBMixingMap(j,i)%sigma0 = GBMixingMap(i,j)%sigma0
261 +             GBMixingMap(j,i)%dw     = GBMixingMap(i,j)%dw    
262 +             GBMixingMap(j,i)%eps0   = GBMixingMap(i,j)%eps0  
263 +             GBMixingMap(j,i)%x2     = GBMixingMap(i,j)%x2    
264 +             GBMixingMap(j,i)%xa2    = GBMixingMap(i,j)%xa2  
265 +             GBMixingMap(j,i)%xai2   = GBMixingMap(i,j)%xai2  
266 +             GBMixingMap(j,i)%xp2    = GBMixingMap(i,j)%xp2  
267 +             GBMixingMap(j,i)%xpap2  = GBMixingMap(i,j)%xpap2
268 +             GBMixingMap(j,i)%xpapi2 = GBMixingMap(i,j)%xpapi2
269 +          endif
270 +       enddo
271 +    enddo
272 +    haveMixingMap = .true.
273 +    mu = getGayBerneMu()
274 +    nu = getGayBerneNu()    
275 +  end subroutine createGBMixingMap
276    
277 +
278    !! gay berne cutoff should be a parameter in globals, this is a temporary
279    !! work around - this should be fixed when gay berne is up and running
280  
281    function getGayBerneCut(atomID) result(cutValue)
282      integer, intent(in) :: atomID
283      integer :: gbt1
284 <    real(kind=dp) :: cutValue, sigma, l2b_ratio
284 >    real(kind=dp) :: cutValue, l, d
285  
286      if (GBMap%currentGBtype == 0) then
287         call handleError("GB", "No members in GBMap")
# Line 157 | Line 289 | contains
289      end if
290  
291      gbt1 = GBMap%atidToGBtype(atomID)
292 <    sigma = GBMap%GBtypes(gbt1)%sigma
293 <    l2b_ratio = GBMap%GBtypes(gbt1)%l2b_ratio
292 >    l = GBMap%GBtypes(gbt1)%l
293 >    d = GBMap%GBtypes(gbt1)%d  
294 >    cutValue = 2.5_dp*max(l,d)
295  
163    cutValue = l2b_ratio*sigma*2.5_dp
296    end function getGayBerneCut
297  
298    subroutine do_gb_pair(atom1, atom2, d, r, r2, sw, vpair, fpair, &
299 <       pot, A, f, t, do_pot)
299 >       pot, Amat, f, t, do_pot)
300      
301      integer, intent(in) :: atom1, atom2
302      integer :: atid1, atid2, gbt1, gbt2, id1, id2
# Line 172 | Line 304 | contains
304      real (kind=dp), dimension(3), intent(in) :: d
305      real (kind=dp), dimension(3), intent(inout) :: fpair
306      real (kind=dp) :: pot, sw, vpair
307 <    real (kind=dp), dimension(9,nLocal) :: A
307 >    real (kind=dp), dimension(9,nLocal) :: Amat
308      real (kind=dp), dimension(3,nLocal) :: f
309      real (kind=dp), dimension(3,nLocal) :: t
310      logical, intent(in) :: do_pot
311 <    real (kind = dp), dimension(3) :: ul1
180 <    real (kind = dp), dimension(3) :: ul2
311 >    real (kind = dp), dimension(3) :: ul1, ul2, rxu1, rxu2, uxu, rhat
312  
313 <    real(kind=dp) :: sigma, l2b_ratio, epsilon, eps_ratio, mu, nu, sigma_l, eps_l
314 <    real(kind=dp) :: chi, chiprime, emu, s2
315 <    real(kind=dp) :: r4, rdotu1, rdotu2, u1dotu2, g, gp, gpi, gmu, gmum
316 <    real(kind=dp) :: curlyE, enu, enum, eps, dotsum, dotdiff, ds2, dd2
317 <    real(kind=dp) :: opXdot, omXdot, opXpdot, omXpdot, pref, gfact
318 <    real(kind=dp) :: BigR, Ri, Ri2, Ri6, Ri7, Ri12, Ri13, R126, R137
319 <    real(kind=dp) :: dru1dx, dru1dy, dru1dz
320 <    real(kind=dp) :: dru2dx, dru2dy, dru2dz
321 <    real(kind=dp) :: dBigRdx, dBigRdy, dBigRdz
322 <    real(kind=dp) :: dBigRdu1x, dBigRdu1y, dBigRdu1z
192 <    real(kind=dp) :: dBigRdu2x, dBigRdu2y, dBigRdu2z
193 <    real(kind=dp) :: dUdx, dUdy, dUdz
194 <    real(kind=dp) :: dUdu1x, dUdu1y, dUdu1z, dUdu2x, dUdu2y, dUdu2z
195 <    real(kind=dp) :: dcE, dcEdu1x, dcEdu1y, dcEdu1z, dcEdu2x, dcEdu2y, dcEdu2z
196 <    real(kind=dp) :: depsdu1x, depsdu1y, depsdu1z, depsdu2x, depsdu2y, depsdu2z
197 <    real(kind=dp) :: drdx, drdy, drdz
198 <    real(kind=dp) :: dgdx, dgdy, dgdz
199 <    real(kind=dp) :: dgdu1x, dgdu1y, dgdu1z, dgdu2x, dgdu2y, dgdu2z
200 <    real(kind=dp) :: dgpdx, dgpdy, dgpdz
201 <    real(kind=dp) :: dgpdu1x, dgpdu1y, dgpdu1z, dgpdu2x, dgpdu2y, dgpdu2z
202 <    real(kind=dp) :: line1a, line1bx, line1by, line1bz
203 <    real(kind=dp) :: line2a, line2bx, line2by, line2bz
204 <    real(kind=dp) :: line3a, line3b, line3, line3x, line3y, line3z
205 <    real(kind=dp) :: term1x, term1y, term1z, term1u1x, term1u1y, term1u1z
206 <    real(kind=dp) :: term1u2x, term1u2y, term1u2z
207 <    real(kind=dp) :: term2a, term2b, term2u1x, term2u1y, term2u1z
208 <    real(kind=dp) :: term2u2x, term2u2y, term2u2z
209 <    real(kind=dp) :: yick1, yick2, mess1, mess2
210 <    
313 >    real (kind = dp) :: sigma0, dw, eps0, x2, xa2, xai2, xp2, xpap2, xpapi2
314 >    real (kind = dp) :: e1, e2, eps, sigma, s3, s03, au2, bu2, au, bu, a, b, g, g2
315 >    real (kind = dp) :: U, BigR, R3, R6, R7, R12, R13, H, Hp, fx, fy, fz
316 >    real (kind = dp) :: dUdr, dUda, dUdb, dUdg, pref1, pref2
317 >    logical :: i_is_lj, j_is_lj
318 >
319 >    if (.not.haveMixingMap) then
320 >       call createGBMixingMap()
321 >    endif
322 >
323   #ifdef IS_MPI
324      atid1 = atid_Row(atom1)
325      atid2 = atid_Col(atom2)
# Line 217 | Line 329 | contains
329   #endif
330  
331      gbt1 = GBMap%atidToGBtype(atid1)
332 <    gbt2 = GBMap%atidToGBtype(atid2)
332 >    gbt2 = GBMap%atidToGBtype(atid2)    
333  
334 <    if (gbt1 .eq. gbt2) then
335 <       sigma     = GBMap%GBtypes(gbt1)%sigma      
224 <       l2b_ratio = GBMap%GBtypes(gbt1)%l2b_ratio  
225 <       epsilon   = GBMap%GBtypes(gbt1)%eps        
226 <       eps_ratio = GBMap%GBtypes(gbt1)%eps_ratio  
227 <       mu        = GBMap%GBtypes(gbt1)%mu        
228 <       nu        = GBMap%GBtypes(gbt1)%nu        
229 <       sigma_l   = GBMap%GBtypes(gbt1)%sigma_l    
230 <       eps_l     = GBMap%GBtypes(gbt1)%eps_l      
231 <    else
232 <       call handleError("GB", "GB-pair was called with two different GB types! OOPSE can only handle interactions for one GB type at a time.")
233 <    endif
334 >    i_is_LJ = GBMap%GBTypes(gbt1)%isLJ
335 >    j_is_LJ = GBMap%GBTypes(gbt2)%isLJ
336  
337 <    s2 = (l2b_ratio)**2
338 <    emu = (eps_ratio)**(1.0d0/mu)
339 <
340 <    chi = (s2 - 1.0d0)/(s2 + 1.0d0)
341 <    chiprime = (1.0d0 - emu)/(1.0d0 + emu)
342 <
343 <    r4 = r2*r2
344 <
337 >    sigma0 = GBMixingMap(gbt1, gbt2)%sigma0
338 >    dw     = GBMixingMap(gbt1, gbt2)%dw    
339 >    eps0   = GBMixingMap(gbt1, gbt2)%eps0  
340 >    x2     = GBMixingMap(gbt1, gbt2)%x2    
341 >    xa2    = GBMixingMap(gbt1, gbt2)%xa2  
342 >    xai2   = GBMixingMap(gbt1, gbt2)%xai2  
343 >    xp2    = GBMixingMap(gbt1, gbt2)%xp2  
344 >    xpap2  = GBMixingMap(gbt1, gbt2)%xpap2
345 >    xpapi2 = GBMixingMap(gbt1, gbt2)%xpapi2
346 >    
347   #ifdef IS_MPI
348 <    ul1(1) = A_Row(3,atom1)
349 <    ul1(2) = A_Row(6,atom1)
348 >    ul1(1) = A_Row(7,atom1)
349 >    ul1(2) = A_Row(8,atom1)
350      ul1(3) = A_Row(9,atom1)
351  
352 <    ul2(1) = A_Col(3,atom2)
353 <    ul2(2) = A_Col(6,atom2)
352 >    ul2(1) = A_Col(7,atom2)
353 >    ul2(2) = A_Col(8,atom2)
354      ul2(3) = A_Col(9,atom2)
355   #else
356 <    ul1(1) = A(3,atom1)
357 <    ul1(2) = A(6,atom1)
358 <    ul1(3) = A(9,atom1)
356 >    ul1(1) = Amat(7,atom1)
357 >    ul1(2) = Amat(8,atom1)
358 >    ul1(3) = Amat(9,atom1)
359  
360 <    ul2(1) = A(3,atom2)
361 <    ul2(2) = A(6,atom2)
362 <    ul2(3) = A(9,atom2)
360 >    ul2(1) = Amat(7,atom2)
361 >    ul2(2) = Amat(8,atom2)
362 >    ul2(3) = Amat(9,atom2)
363   #endif
364      
365 <    dru1dx = ul1(1)
366 <    dru2dx = ul2(1)
367 <    dru1dy = ul1(2)
368 <    dru2dy = ul2(2)
369 <    dru1dz = ul1(3)
370 <    dru2dz = ul2(3)
267 <        
268 <    drdx = d(1) / r
269 <    drdy = d(2) / r
270 <    drdz = d(3) / r
271 <    
272 <    ! do some dot products:
273 <    ! NB the r in these dot products is the actual intermolecular vector,
274 <    ! and is not the unit vector in that direction.
275 <    
276 <    rdotu1 = d(1)*ul1(1) + d(2)*ul1(2) + d(3)*ul1(3)
277 <    rdotu2 = d(1)*ul2(1) + d(2)*ul2(2) + d(3)*ul2(3)
278 <    u1dotu2 = ul1(1)*ul2(1) + ul1(2)*ul2(2) +  ul1(3)*ul2(3)
365 >    if (i_is_LJ) then
366 >       a = 0.0_dp
367 >       ul1 = 0.0_dp
368 >    else
369 >       a = d(1)*ul1(1)   + d(2)*ul1(2)   + d(3)*ul1(3)
370 >    endif
371  
372 <    ! This stuff is all for the calculation of g(Chi) and dgdx
373 <    ! Line numbers roughly follow the lines in equation A25 of Luckhurst
374 <    !   et al. Liquid Crystals 8, 451-464 (1990).
375 <    ! We note however, that there are some major typos in that Appendix
376 <    ! of the Luckhurst paper, particularly in equations A23, A29 and A31
377 <    ! We have attempted to correct them below.
286 <    
287 <    dotsum = rdotu1+rdotu2
288 <    dotdiff = rdotu1-rdotu2
289 <    ds2 = dotsum*dotsum
290 <    dd2 = dotdiff*dotdiff
291 <  
292 <    opXdot = 1.0d0 + Chi*u1dotu2
293 <    omXdot = 1.0d0 - Chi*u1dotu2
294 <    opXpdot = 1.0d0 + ChiPrime*u1dotu2
295 <    omXpdot = 1.0d0 - ChiPrime*u1dotu2
296 <  
297 <    line1a = dotsum/opXdot
298 <    line1bx = dru1dx + dru2dx
299 <    line1by = dru1dy + dru2dy
300 <    line1bz = dru1dz + dru2dz
301 <    
302 <    line2a = dotdiff/omXdot
303 <    line2bx = dru1dx - dru2dx
304 <    line2by = dru1dy - dru2dy
305 <    line2bz = dru1dz - dru2dz
306 <    
307 <    term1x = -Chi*(line1a*line1bx + line2a*line2bx)/r2
308 <    term1y = -Chi*(line1a*line1by + line2a*line2by)/r2
309 <    term1z = -Chi*(line1a*line1bz + line2a*line2bz)/r2
310 <    
311 <    line3a = ds2/opXdot
312 <    line3b = dd2/omXdot
313 <    line3 = Chi*(line3a + line3b)/r4
314 <    line3x = d(1)*line3
315 <    line3y = d(2)*line3
316 <    line3z = d(3)*line3
317 <    
318 <    dgdx = term1x + line3x
319 <    dgdy = term1y + line3y
320 <    dgdz = term1z + line3z
372 >    if (j_is_LJ) then
373 >       b = 0.0_dp
374 >       ul2 = 0.0_dp
375 >    else      
376 >       b = d(1)*ul2(1)   + d(2)*ul2(2)   + d(3)*ul2(3)
377 >    endif
378  
379 <    term1u1x = 2.0d0*(line1a+line2a)*d(1)
380 <    term1u1y = 2.0d0*(line1a+line2a)*d(2)
381 <    term1u1z = 2.0d0*(line1a+line2a)*d(3)
382 <    term1u2x = 2.0d0*(line1a-line2a)*d(1)
383 <    term1u2y = 2.0d0*(line1a-line2a)*d(2)
327 <    term1u2z = 2.0d0*(line1a-line2a)*d(3)
328 <    
329 <    term2a = -line3a/opXdot
330 <    term2b =  line3b/omXdot
331 <    
332 <    term2u1x = Chi*ul2(1)*(term2a + term2b)
333 <    term2u1y = Chi*ul2(2)*(term2a + term2b)
334 <    term2u1z = Chi*ul2(3)*(term2a + term2b)
335 <    term2u2x = Chi*ul1(1)*(term2a + term2b)
336 <    term2u2y = Chi*ul1(2)*(term2a + term2b)
337 <    term2u2z = Chi*ul1(3)*(term2a + term2b)
338 <    
339 <    pref = -Chi*0.5d0/r2
379 >    if (i_is_LJ.or.j_is_LJ) then
380 >       g = 0.0_dp
381 >    else
382 >       g = ul1(1)*ul2(1) + ul1(2)*ul2(2) + ul1(3)*ul2(3)
383 >    endif
384  
385 <    dgdu1x = pref*(term1u1x+term2u1x)
386 <    dgdu1y = pref*(term1u1y+term2u1y)
343 <    dgdu1z = pref*(term1u1z+term2u1z)
344 <    dgdu2x = pref*(term1u2x+term2u2x)
345 <    dgdu2y = pref*(term1u2y+term2u2y)
346 <    dgdu2z = pref*(term1u2z+term2u2z)
385 >    au = a / r
386 >    bu = b / r
387  
388 <    g = 1.0d0 - Chi*(line3a + line3b)/(2.0d0*r2)
389 <  
390 <    BigR = (r - sigma*(g**(-0.5d0)) + sigma)/sigma
351 <    Ri = 1.0d0/BigR
352 <    Ri2 = Ri*Ri
353 <    Ri6 = Ri2*Ri2*Ri2
354 <    Ri7 = Ri6*Ri
355 <    Ri12 = Ri6*Ri6
356 <    Ri13 = Ri6*Ri7
388 >    au2 = au * au
389 >    bu2 = bu * bu
390 >    g2 = g * g
391  
392 <    gfact = (g**(-1.5d0))*0.5d0
392 >    H  = (xa2 * au2 + xai2 * bu2 - 2.0_dp*x2*au*bu*g)  / (1.0_dp - x2*g2)
393 >    Hp = (xpap2*au2 + xpapi2*bu2 - 2.0_dp*xp2*au*bu*g) / (1.0_dp - xp2*g2)
394  
395 <    dBigRdx = drdx/sigma + dgdx*gfact
396 <    dBigRdy = drdy/sigma + dgdy*gfact
397 <    dBigRdz = drdz/sigma + dgdz*gfact
395 >    sigma = sigma0 / sqrt(1.0_dp - H)
396 >    e1 = 1.0_dp / sqrt(1.0_dp - x2*g2)
397 >    e2 = 1.0_dp - Hp
398 >    eps = eps0 * (e1**nu) * (e2**mu)
399 >    BigR = dw*sigma0 / (r - sigma + dw*sigma0)
400 >    
401 >    R3 = BigR*BigR*BigR
402 >    R6 = R3*R3
403 >    R7 = R6 * BigR
404 >    R12 = R6*R6
405 >    R13 = R6*R7
406  
407 <    dBigRdu1x = dgdu1x*gfact
365 <    dBigRdu1y = dgdu1y*gfact
366 <    dBigRdu1z = dgdu1z*gfact
367 <    dBigRdu2x = dgdu2x*gfact
368 <    dBigRdu2y = dgdu2y*gfact
369 <    dBigRdu2z = dgdu2z*gfact
407 >    U = 4.0_dp * eps * (R12 - R6)
408  
409 <    ! Now, we must do it again for g(ChiPrime) and dgpdx
409 >    s3 = sigma*sigma*sigma
410 >    s03 = sigma0*sigma0*sigma0
411  
412 <    line1a = dotsum/opXpdot
374 <    line2a = dotdiff/omXpdot
375 <    term1x = -ChiPrime*(line1a*line1bx + line2a*line2bx)/r2
376 <    term1y = -ChiPrime*(line1a*line1by + line2a*line2by)/r2
377 <    term1z = -ChiPrime*(line1a*line1bz + line2a*line2bz)/r2
378 <    line3a = ds2/opXpdot
379 <    line3b = dd2/omXpdot
380 <    line3 = ChiPrime*(line3a + line3b)/r4
381 <    line3x = d(1)*line3
382 <    line3y = d(2)*line3
383 <    line3z = d(3)*line3
384 <    
385 <    dgpdx = term1x + line3x
386 <    dgpdy = term1y + line3y
387 <    dgpdz = term1z + line3z
388 <    
389 <    term1u1x = 2.00d0*(line1a+line2a)*d(1)
390 <    term1u1y = 2.00d0*(line1a+line2a)*d(2)
391 <    term1u1z = 2.00d0*(line1a+line2a)*d(3)
392 <    term1u2x = 2.0d0*(line1a-line2a)*d(1)
393 <    term1u2y = 2.0d0*(line1a-line2a)*d(2)
394 <    term1u2z = 2.0d0*(line1a-line2a)*d(3)
412 >    pref1 = - 8.0_dp * eps * mu * (R12 - R6) / (e2 * r)
413  
414 <    term2a = -line3a/opXpdot
415 <    term2b =  line3b/omXpdot
414 >    pref2 = 8.0_dp * eps * s3 * (6.0_dp*R13 - 3.0_dp*R7) / (dw*r*s03)
415 >
416 >    dUdr = - (pref1 * Hp + pref2 * (sigma0*sigma0*r/s3 + H))
417      
418 <    term2u1x = ChiPrime*ul2(1)*(term2a + term2b)
419 <    term2u1y = ChiPrime*ul2(2)*(term2a + term2b)
401 <    term2u1z = ChiPrime*ul2(3)*(term2a + term2b)
402 <    term2u2x = ChiPrime*ul1(1)*(term2a + term2b)
403 <    term2u2y = ChiPrime*ul1(2)*(term2a + term2b)
404 <    term2u2z = ChiPrime*ul1(3)*(term2a + term2b)
405 <  
406 <    pref = -ChiPrime*0.5d0/r2
407 <    
408 <    dgpdu1x = pref*(term1u1x+term2u1x)
409 <    dgpdu1y = pref*(term1u1y+term2u1y)
410 <    dgpdu1z = pref*(term1u1z+term2u1z)
411 <    dgpdu2x = pref*(term1u2x+term2u2x)
412 <    dgpdu2y = pref*(term1u2y+term2u2y)
413 <    dgpdu2z = pref*(term1u2z+term2u2z)
414 <    
415 <    gp = 1.0d0 - ChiPrime*(line3a + line3b)/(2.0d0*r2)
416 <    gmu = gp**mu
417 <    gpi = 1.0d0 / gp
418 <    gmum = gmu*gpi
418 >    dUda = pref1 * (xpap2*au - xp2*bu*g) / (1.0_dp - xp2 * g2) &
419 >         + pref2 * (xa2 * au - x2 *bu*g) / (1.0_dp - x2 * g2)
420  
421 <    curlyE = 1.0d0/dsqrt(1.0d0 - Chi*Chi*u1dotu2*u1dotu2)
422 < !!$
422 < !!$    dcE = -(curlyE**3)*Chi*Chi*u1dotu2
423 <    dcE = (curlyE**3)*Chi*Chi*u1dotu2
421 >    dUdb = pref1 * (xpapi2*bu - xp2*au*g) / (1.0_dp - xp2 * g2) &
422 >         + pref2 * (xai2 * bu - x2 *au*g) / (1.0_dp - x2 * g2)
423  
424 <    dcEdu1x = dcE*ul2(1)
425 <    dcEdu1y = dcE*ul2(2)
426 <    dcEdu1z = dcE*ul2(3)
427 <    dcEdu2x = dcE*ul1(1)
428 <    dcEdu2y = dcE*ul1(2)
430 <    dcEdu2z = dcE*ul1(3)
431 <    
432 <    enu = curlyE**nu
433 <    enum = enu/curlyE
434 <  
435 <    eps = epsilon*enu*gmu
424 >    dUdg = 4.0_dp * eps * nu * (R12 - R6) * x2 * g / (1.0_dp - x2*g2) &
425 >         + 8.0_dp * eps * mu * (R12 - R6) * (xp2*au*bu - Hp*xp2*g) / &
426 >         (1.0_dp - xp2 * g2) / e2 &
427 >         + 8.0_dp * eps * s3 * (3.0_dp * R7 - 6.0_dp * R13) * &  
428 >         (x2 * au * bu - H * x2 * g) / (1.0_dp - x2 * g2) / (dw * s03)
429  
430 <    yick1 = epsilon*enu*mu*gmum
431 <    yick2 = epsilon*gmu*nu*enum
430 >            
431 >    rhat = d / r
432  
433 <    depsdu1x = yick1*dgpdu1x + yick2*dcEdu1x
434 <    depsdu1y = yick1*dgpdu1y + yick2*dcEdu1y
435 <    depsdu1z = yick1*dgpdu1z + yick2*dcEdu1z
436 <    depsdu2x = yick1*dgpdu2x + yick2*dcEdu2x
437 <    depsdu2y = yick1*dgpdu2y + yick2*dcEdu2y
438 <    depsdu2z = yick1*dgpdu2z + yick2*dcEdu2z
433 >    fx = dUdr * rhat(1) + dUda * ul1(1) + dUdb * ul2(1)
434 >    fy = dUdr * rhat(2) + dUda * ul1(2) + dUdb * ul2(2)
435 >    fz = dUdr * rhat(3) + dUda * ul1(3) + dUdb * ul2(3)    
436 >
437 >    rxu1 = cross_product(d, ul1)
438 >    rxu2 = cross_product(d, ul2)    
439 >    uxu = cross_product(ul1, ul2)
440      
441 <    R126 = Ri12 - Ri6
442 <    R137 = 6.0d0*Ri7 - 12.0d0*Ri13
443 <    
444 <    mess1 = gmu*R137
445 <    mess2 = R126*mu*gmum
446 <    
447 <    dUdx = 4.0d0*epsilon*enu*(mess1*dBigRdx + mess2*dgpdx)*sw
448 <    dUdy = 4.0d0*epsilon*enu*(mess1*dBigRdy + mess2*dgpdy)*sw
449 <    dUdz = 4.0d0*epsilon*enu*(mess1*dBigRdz + mess2*dgpdz)*sw
450 <    
451 <    dUdu1x = 4.0d0*(R126*depsdu1x + eps*R137*dBigRdu1x)*sw
452 <    dUdu1y = 4.0d0*(R126*depsdu1y + eps*R137*dBigRdu1y)*sw
453 <    dUdu1z = 4.0d0*(R126*depsdu1z + eps*R137*dBigRdu1z)*sw
454 <    dUdu2x = 4.0d0*(R126*depsdu2x + eps*R137*dBigRdu2x)*sw
455 <    dUdu2y = 4.0d0*(R126*depsdu2y + eps*R137*dBigRdu2y)*sw
462 <    dUdu2z = 4.0d0*(R126*depsdu2z + eps*R137*dBigRdu2z)*sw
463 <      
441 > !!$    write(*,*) 'pref = ' , pref1, pref2
442 > !!$    write(*,*) 'rxu1 = ' , rxu1(1), rxu1(2), rxu1(3)
443 > !!$    write(*,*) 'rxu2 = ' , rxu2(1), rxu2(2), rxu2(3)
444 > !!$    write(*,*) 'uxu = ' , uxu(1), uxu(2), uxu(3)
445 > !!$    write(*,*) 'dUda = ', dUda, dudb, dudg, dudr
446 > !!$    write(*,*) 'H = ', H,hp,sigma, e1, e2, BigR
447 > !!$    write(*,*) 'chi = ', xa2, xai2, x2
448 > !!$    write(*,*) 'chip = ', xpap2, xpapi2, xp2
449 > !!$    write(*,*) 'eps = ', eps0, e1, e2, eps
450 > !!$    write(*,*) 'U =', U, pref1, pref2
451 > !!$    write(*,*) 'f =', fx, fy, fz
452 > !!$    write(*,*) 'au =', au, bu, g
453 > !!$    
454 >        
455 >  
456   #ifdef IS_MPI
457 <    f_Row(1,atom1) = f_Row(1,atom1) + dUdx
458 <    f_Row(2,atom1) = f_Row(2,atom1) + dUdy
459 <    f_Row(3,atom1) = f_Row(3,atom1) + dUdz
457 >    f_Row(1,atom1) = f_Row(1,atom1) + fx
458 >    f_Row(2,atom1) = f_Row(2,atom1) + fy
459 >    f_Row(3,atom1) = f_Row(3,atom1) + fz
460      
461 <    f_Col(1,atom2) = f_Col(1,atom2) - dUdx
462 <    f_Col(2,atom2) = f_Col(2,atom2) - dUdy
463 <    f_Col(3,atom2) = f_Col(3,atom2) - dUdz
461 >    f_Col(1,atom2) = f_Col(1,atom2) - fx
462 >    f_Col(2,atom2) = f_Col(2,atom2) - fy
463 >    f_Col(3,atom2) = f_Col(3,atom2) - fz
464      
465 <    t_Row(1,atom1) = t_Row(1,atom1)- ul1(3)*dUdu1y + ul1(2)*dUdu1z
466 <    t_Row(2,atom1) = t_Row(2,atom1)- ul1(1)*dUdu1z + ul1(3)*dUdu1x
467 <    t_Row(3,atom1) = t_Row(3,atom1)- ul1(2)*dUdu1x + ul1(1)*dUdu1y
468 <    
469 <    t_Col(1,atom2) = t_Col(1,atom2) - ul2(3)*dUdu2y + ul2(2)*dUdu2z
470 <    t_Col(2,atom2) = t_Col(2,atom2) - ul2(1)*dUdu2z + ul2(3)*dUdu2x
471 <    t_Col(3,atom2) = t_Col(3,atom2) - ul2(2)*dUdu2x + ul2(1)*dUdu2y
465 >    t_Row(1,atom1) = t_Row(1,atom1) + dUda*rxu1(1) - dUdg*uxu(1)
466 >    t_Row(2,atom1) = t_Row(2,atom1) + dUda*rxu1(2) - dUdg*uxu(2)
467 >    t_Row(3,atom1) = t_Row(3,atom1) + dUda*rxu1(3) - dUdg*uxu(3)
468 >                                                                
469 >    t_Col(1,atom2) = t_Col(1,atom2) + dUdb*rxu2(1) + dUdg*uxu(1)
470 >    t_Col(2,atom2) = t_Col(2,atom2) + dUdb*rxu2(2) + dUdg*uxu(2)
471 >    t_Col(3,atom2) = t_Col(3,atom2) + dUdb*rxu2(3) + dUdg*uxu(3)
472   #else
473 <    f(1,atom1) = f(1,atom1) + dUdx
474 <    f(2,atom1) = f(2,atom1) + dUdy
475 <    f(3,atom1) = f(3,atom1) + dUdz
473 >    f(1,atom1) = f(1,atom1) + fx
474 >    f(2,atom1) = f(2,atom1) + fy
475 >    f(3,atom1) = f(3,atom1) + fz
476      
477 <    f(1,atom2) = f(1,atom2) - dUdx
478 <    f(2,atom2) = f(2,atom2) - dUdy
479 <    f(3,atom2) = f(3,atom2) - dUdz
477 >    f(1,atom2) = f(1,atom2) - fx
478 >    f(2,atom2) = f(2,atom2) - fy
479 >    f(3,atom2) = f(3,atom2) - fz
480      
481 <    t(1,atom1) = t(1,atom1)- ul1(3)*dUdu1y + ul1(2)*dUdu1z
482 <    t(2,atom1) = t(2,atom1)- ul1(1)*dUdu1z + ul1(3)*dUdu1x
483 <    t(3,atom1) = t(3,atom1)- ul1(2)*dUdu1x + ul1(1)*dUdu1y
484 <    
485 <    t(1,atom2) = t(1,atom2)- ul2(3)*dUdu2y + ul2(2)*dUdu2z
486 <    t(2,atom2) = t(2,atom2)- ul2(1)*dUdu2z + ul2(3)*dUdu2x
487 <    t(3,atom2) = t(3,atom2)- ul2(2)*dUdu2x + ul2(1)*dUdu2y
481 >    t(1,atom1) = t(1,atom1) +  dUda*rxu1(1) - dUdg*uxu(1)
482 >    t(2,atom1) = t(2,atom1) +  dUda*rxu1(2) - dUdg*uxu(2)
483 >    t(3,atom1) = t(3,atom1) +  dUda*rxu1(3) - dUdg*uxu(3)
484 >                                                        
485 >    t(1,atom2) = t(1,atom2) +  dUdb*rxu2(1) + dUdg*uxu(1)
486 >    t(2,atom2) = t(2,atom2) +  dUdb*rxu2(2) + dUdg*uxu(2)
487 >    t(3,atom2) = t(3,atom2) +  dUdb*rxu2(3) + dUdg*uxu(3)
488   #endif
489    
490      if (do_pot) then
491   #ifdef IS_MPI
492 <       pot_row(VDW_POT,atom1) = pot_row(VDW_POT,atom1) + 2.0d0*eps*R126*sw
493 <       pot_col(VDW_POT,atom2) = pot_col(VDW_POT,atom2) + 2.0d0*eps*R126*sw
492 >       pot_row(VDW_POT,atom1) = pot_row(VDW_POT,atom1) + 0.5d0*U*sw
493 >       pot_col(VDW_POT,atom2) = pot_col(VDW_POT,atom2) + 0.5d0*U*sw
494   #else
495 <       pot = pot + 4.0*eps*R126*sw
495 >       pot = pot + U*sw
496   #endif
497      endif
498      
499 <    vpair = vpair + 4.0*eps*R126
499 >    vpair = vpair + U*sw
500   #ifdef IS_MPI
501      id1 = AtomRowToGlobal(atom1)
502      id2 = AtomColToGlobal(atom2)
# Line 515 | Line 507 | contains
507      
508      if (molMembershipList(id1) .ne. molMembershipList(id2)) then
509        
510 <       fpair(1) = fpair(1) + dUdx
511 <       fpair(2) = fpair(2) + dUdy
512 <       fpair(3) = fpair(3) + dUdz
510 >       fpair(1) = fpair(1) + fx
511 >       fpair(2) = fpair(2) + fy
512 >       fpair(3) = fpair(3) + fz
513        
514      endif
515      
516      return
517    end subroutine do_gb_pair
526
527  subroutine do_gb_lj_pair(atom1, atom2, d, r, r2, sw, vpair, fpair, &
528       pot, A, f, t, do_pot)
529    
530    integer, intent(in) :: atom1, atom2
531    integer :: id1, id2
532    real (kind=dp), intent(inout) :: r, r2
533    real (kind=dp), dimension(3), intent(in) :: d
534    real (kind=dp), dimension(3), intent(inout) :: fpair
535    real (kind=dp) :: pot, sw, vpair
536    real (kind=dp), dimension(9,nLocal) :: A
537    real (kind=dp), dimension(3,nLocal) :: f
538    real (kind=dp), dimension(3,nLocal) :: t
539    logical, intent(in) :: do_pot
540    real (kind = dp), dimension(3) :: ul
541    
542    real(kind=dp) :: gb_sigma, gb_eps, gb_eps_ratio, gb_mu, gb_sigma_l
543    real(kind=dp) :: spar, sperp, slj, par2, perp2, sc, slj2
544    real(kind=dp) :: s_par2mperp2, s_lj2ppar2
545    real(kind=dp) :: enot, eperp, epar, eab, eabf,moom, mum1
546    real(kind=dp) :: dx, dy, dz, drdx,drdy,drdz, rdotu
547    real(kind=dp) :: mess, sab, dsabdct, eprime, deprimedct, depmudct
548    real(kind=dp) :: epmu, depmudx, depmudy, depmudz
549    real(kind=dp) :: depmudux, depmuduy, depmuduz
550    real(kind=dp) :: BigR, dBigRdx, dBigRdy, dBigRdz
551    real(kind=dp) :: dBigRdux, dBigRduy, dBigRduz
552    real(kind=dp) :: dUdx, dUdy, dUdz, dUdux, dUduy, dUduz, e0
553    real(kind=dp) :: Ri, Ri3, Ri6, Ri7, Ri12, Ri13, R126, R137, prefactor
554    real(kind=dp) :: chipoalphap2, chioalpha2, ec, epsnot
555    real(kind=dp) :: drdotudx, drdotudy, drdotudz    
556    real(kind=dp) :: drdotudux, drdotuduy, drdotuduz    
557    real(kind=dp) :: ljeps, ljsigma, sigmaratio, sigmaratioi
558    integer :: ljt1, ljt2, atid1, atid2, gbt1, gbt2
559    logical :: gb_first
560    
561 #ifdef IS_MPI
562    atid1 = atid_Row(atom1)
563    atid2 = atid_Col(atom2)
564 #else
565    atid1 = atid(atom1)
566    atid2 = atid(atom2)
567 #endif
568    
569    gbt1 = GBMap%atidToGBtype(atid1)
570    gbt2 = GBMap%atidToGBtype(atid2)
571    
572    if (gbt1 .eq. -1) then
573       gb_first = .false.
574       if (gbt2 .eq. -1) then
575          call handleError("GB", "GBLJ was called without a GB type.")
576       endif
577    else
578       gb_first = .true.
579       if (gbt2 .ne. -1) then
580          call handleError("GB", "GBLJ was called with two GB types (instead of one).")
581       endif
582    endif
583    
584    ri =1/r
585    
586    dx = d(1)
587    dy = d(2)
588    dz = d(3)
589    
590    drdx = dx *ri
591    drdy = dy *ri
592    drdz = dz *ri
593    
594    if(gb_first)then
595 #ifdef IS_MPI
596       ul(1) = A_Row(3,atom1)
597       ul(2) = A_Row(6,atom1)
598       ul(3) = A_Row(9,atom1)
599 #else
600       ul(1) = A(3,atom1)
601       ul(2) = A(6,atom1)
602       ul(3) = A(9,atom1)      
603 #endif
604       gb_sigma     = GBMap%GBtypes(gbt1)%sigma      
605       gb_eps       = GBMap%GBtypes(gbt1)%eps        
606       gb_eps_ratio = GBMap%GBtypes(gbt1)%eps_ratio  
607       gb_mu        = GBMap%GBtypes(gbt1)%mu        
608       gb_sigma_l   = GBMap%GBtypes(gbt1)%sigma_l
609
610       ljsigma = getSigma(atid2)
611       ljeps = getEpsilon(atid2)
612    else
613 #ifdef IS_MPI
614       ul(1) = A_Col(3,atom2)
615       ul(2) = A_Col(6,atom2)
616       ul(3) = A_Col(9,atom2)
617 #else
618       ul(1) = A(3,atom2)
619       ul(2) = A(6,atom2)
620       ul(3) = A(9,atom2)      
621 #endif
622       gb_sigma     = GBMap%GBtypes(gbt2)%sigma      
623       gb_eps       = GBMap%GBtypes(gbt2)%eps        
624       gb_eps_ratio = GBMap%GBtypes(gbt2)%eps_ratio  
625       gb_mu        = GBMap%GBtypes(gbt2)%mu        
626       gb_sigma_l   = GBMap%GBtypes(gbt2)%sigma_l
627
628       ljsigma = getSigma(atid1)
629       ljeps = getEpsilon(atid1)
630    endif
631  
632    write(*,*) 'd u', dx, dy, dz, ul(1), ul(2), ul(3)
633
634    rdotu = (dx*ul(1)+dy*ul(2)+dz*ul(3))*ri
635  
636    drdotudx = ul(1)*ri-rdotu*dx*ri*ri
637    drdotudy = ul(2)*ri-rdotu*dy*ri*ri
638    drdotudz = ul(3)*ri-rdotu*dz*ri*ri
639    drdotudux = drdx
640    drdotuduy = drdy
641    drdotuduz = drdz
642
643    
644    moom =  1.0d0 / gb_mu
645    mum1 = gb_mu-1
646    
647    sperp = gb_sigma
648    spar =  gb_sigma_l
649    slj = ljsigma
650    slj2 = slj*slj
651
652    chioalpha2 =1-((sperp+slj)*(sperp+slj))/((spar+slj)*(spar+slj))
653    sc = (sperp+slj)/2.0d0
518    
655    par2 = spar*spar
656    perp2 = sperp*sperp
657    s_par2mperp2 = par2 - perp2
658    s_lj2ppar2 = slj2 + par2
659
660    !! check these ! left from old code
661    !! kdaily e0 may need to be (gb_eps + lj_eps)/2
662    
663    eperp = dsqrt(gb_eps*ljeps)
664    epar = eperp*gb_eps_ratio
665    enot = dsqrt(ljeps*eperp)
666    chipoalphap2 = 1+(dsqrt(epar*ljeps)/enot)**moom
667
668    !! mess matches cleaver (eq 20)
669    
670    mess = 1-rdotu*rdotu*chioalpha2
671    sab = 1.0d0/dsqrt(mess)
672
673    write(*,*) 's', sc, sab, rdotu, chioalpha2
674    dsabdct = sc*sab*sab*sab*rdotu*chioalpha2
675      
676    eab = 1-chipoalphap2*rdotu*rdotu
677    eabf = enot*eab**gb_mu
678
679    write(*,*)  'e', enot, chipoalphap2, gb_mu, rdotu, eab, mum1
680
681    depmudct = -2*enot*chipoalphap2*gb_mu*rdotu*eab**mum1
682        
683    BigR = (r - sab*sc + sc)/sc
684    dBigRdx = (drdx -dsabdct*drdotudx)/sc
685    dBigRdy = (drdy -dsabdct*drdotudy)/sc
686    dBigRdz = (drdz -dsabdct*drdotudz)/sc
687    dBigRdux = (-dsabdct*drdotudux)/sc
688    dBigRduy = (-dsabdct*drdotuduy)/sc
689    dBigRduz = (-dsabdct*drdotuduz)/sc
690    
691    write(*,*) 'ds dep', dsabdct, depmudct
692    write(*,*) 'drdotudu', drdotudux, drdotuduy, drdotuduz
693    depmudx = depmudct*drdotudx
694    depmudy = depmudct*drdotudy
695    depmudz = depmudct*drdotudz
696    depmudux = depmudct*drdotudux
697    depmuduy = depmudct*drdotuduy
698    depmuduz = depmudct*drdotuduz
699    
700    Ri = 1.0d0/BigR
701    Ri3 = Ri*Ri*Ri
702    Ri6 = Ri3*Ri3
703    Ri7 = Ri6*Ri
704    Ri12 = Ri6*Ri6
705    Ri13 = Ri6*Ri7
706    R126 = Ri12 - Ri6
707    R137 = 6.0d0*Ri7 - 12.0d0*Ri13
708    
709    prefactor = 4.0d0
710    
711    dUdx = prefactor*(eabf*R137*dBigRdx + R126*depmudx)
712    dUdy = prefactor*(eabf*R137*dBigRdy + R126*depmudy)
713    dUdz = prefactor*(eabf*R137*dBigRdz + R126*depmudz)
714    write(*,*) 'dRdu',  dbigrdux, dbigrduy, dbigrduz
715    write(*,*) 'dEdu',  depmudux, depmuduy, depmuduz
716    dUdux = prefactor*(eabf*R137*dBigRdux + R126*depmudux)
717    dUduy = prefactor*(eabf*R137*dBigRduy + R126*depmuduy)
718    dUduz = prefactor*(eabf*R137*dBigRduz + R126*depmuduz)
719    
720 #ifdef IS_MPI
721    f_Row(1,atom1) = f_Row(1,atom1) - dUdx
722    f_Row(2,atom1) = f_Row(2,atom1) - dUdy
723    f_Row(3,atom1) = f_Row(3,atom1) - dUdz
724    
725    f_Col(1,atom2) = f_Col(1,atom2) + dUdx
726    f_Col(2,atom2) = f_Col(2,atom2) + dUdy
727    f_Col(3,atom2) = f_Col(3,atom2) + dUdz
728    
729    if (gb_first) then
730       t_Row(1,atom1) = t_Row(1,atom1) + ul(2)*dUduz - ul(3)*dUduy
731       t_Row(2,atom1) = t_Row(2,atom1) + ul(3)*dUdux - ul(1)*dUduz
732       t_Row(3,atom1) = t_Row(3,atom1) + ul(1)*dUduy - ul(2)*dUdux
733    else
734       t_Col(1,atom2) = t_Col(1,atom2) + ul(2)*dUduz - ul(3)*dUduy
735       t_Col(2,atom2) = t_Col(2,atom2) + ul(3)*dUdux - ul(1)*dUduz
736       t_Col(3,atom2) = t_Col(3,atom2) + ul(1)*dUduy - ul(2)*dUdux
737    endif
738 #else    
739    f(1,atom1) = f(1,atom1) + dUdx
740    f(2,atom1) = f(2,atom1) + dUdy
741    f(3,atom1) = f(3,atom1) + dUdz
742    
743    f(1,atom2) = f(1,atom2) - dUdx
744    f(2,atom2) = f(2,atom2) - dUdy
745    f(3,atom2) = f(3,atom2) - dUdz
746    
747    ! torques are cross products:
748    
749    write(*,*) 'dU', dUdux, duduy, duduz
750
751    if (gb_first) then
752       t(1,atom1) = t(1,atom1) + ul(2)*dUduz - ul(3)*dUduy
753       t(2,atom1) = t(2,atom1) + ul(3)*dUdux - ul(1)*dUduz
754       t(3,atom1) = t(3,atom1) + ul(1)*dUduy - ul(2)*dUdux
755       write(*,*) 'T1', t(1,atom1), t(2,atom1), t(3,atom1)
756    else
757       t(1,atom2) = t(1,atom2) + ul(2)*dUduz - ul(3)*dUduy
758       t(2,atom2) = t(2,atom2) + ul(3)*dUdux - ul(1)*dUduz
759       t(3,atom2) = t(3,atom2) + ul(1)*dUduy - ul(2)*dUdux
760
761       write(*,*) 'T2', t(1,atom2), t(2,atom2), t(3,atom2)
762    endif
763
764 #endif
765      
766    if (do_pot) then
767 #ifdef IS_MPI
768       pot_row(VDW_POT,atom1) = pot_row(VDW_POT,atom1) + 2.0d0*eps*R126*sw
769       pot_col(VDW_POT,atom2) = pot_col(VDW_POT,atom2) + 2.0d0*eps*R126*sw
770 #else
771       pot = pot + prefactor*eabf*R126*sw
772 #endif
773    endif
774    
775    vpair = vpair + 4.0*epmu*R126
776 #ifdef IS_MPI
777    id1 = AtomRowToGlobal(atom1)
778    id2 = AtomColToGlobal(atom2)
779 #else
780    id1 = atom1
781    id2 = atom2
782 #endif
783    
784    If (Molmembershiplist(Id1) .Ne. Molmembershiplist(Id2)) Then
785      
786       Fpair(1) = Fpair(1) + Dudx
787       Fpair(2) = Fpair(2) + Dudy
788       Fpair(3) = Fpair(3) + Dudz
789      
790    Endif
791    
792    return
793    
794  end subroutine do_gb_lj_pair
795
519    subroutine destroyGBTypes()
520  
521      GBMap%nGBtypes = 0
# Line 808 | Line 531 | contains
531         GBMap%atidToGBtype => null()
532      end if
533      
534 +    haveMixingMap = .false.
535 +    
536    end subroutine destroyGBTypes
537  
538   end module gayberne

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines