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 2357 by chuckv, Wed Oct 12 20:18:17 2005 UTC vs.
Revision 2802 by gezelter, Tue Jun 6 17:43:28 2006 UTC

# Line 40 | Line 40 | module gb_pair
40   !!
41  
42  
43 < module gb_pair
43 > module gayberne
44    use force_globals
45    use definitions
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
56    
57    implicit none
58  
59 <  PRIVATE
59 >  private
60 >
61   #define __FORTRAN90
62   #include "UseTheForce/DarkSide/fInteractionMap.h"
63  
64 <  logical, save :: gb_pair_initialized = .false.
65 <  real(kind=dp), save :: gb_sigma
66 <  real(kind=dp), save :: gb_l2b_ratio
67 <  real(kind=dp), save :: gb_eps
61 <  real(kind=dp), save :: gb_eps_ratio
62 <  real(kind=dp), save :: gb_mu
63 <  real(kind=dp), save :: gb_nu
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 <  public :: check_gb_pair_FF
70 <  public :: set_gb_pair_params
69 >
70 >  public :: newGBtype
71 >  public :: complete_GB_FF
72    public :: do_gb_pair
73    public :: getGayBerneCut
74 +  public :: destroyGBtypes
75  
76 +  type :: GBtype
77 +     integer          :: atid
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 ) :: dw
83 +     logical          :: isLJ
84 +  end type GBtype
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 +  
93 +  type(GBList), save :: GBMap
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 check_gb_pair_FF(status)
112 <    integer :: status
113 <    status = -1
114 <    if (gb_pair_initialized) status = 0
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) :: d, l, eps, eps_ratio, dw
115 >    integer, intent(out) :: status
116 >    
117 >    integer :: nGBTypes, nLJTypes, ntypes, myATID
118 >    integer, pointer :: MatchList(:) => null()
119 >    integer :: current, i
120 >    status = 0
121 >    
122 >    if (.not.associated(GBMap%GBtypes)) then
123 >      
124 >       call getMatchingElementList(atypes, "is_GayBerne", .true., &
125 >            nGBtypes, MatchList)
126 >      
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))      
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 check_gb_pair_FF
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 >       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 <  subroutine set_gb_pair_params(sigma, l2b_ratio, eps, eps_ratio, mu, nu)
203 <    real( kind = dp ), intent(in) :: sigma, l2b_ratio, eps, eps_ratio
81 <    real( kind = dp ), intent(in) :: mu, nu
82 <  
83 <    gb_sigma = sigma
84 <    gb_l2b_ratio = l2b_ratio
85 <    gb_eps = eps
86 <    gb_eps_ratio = eps_ratio
87 <    gb_mu = mu
88 <    gb_nu = nu
202 >    
203 >  end subroutine complete_GB_FF
204  
205 <    gb_pair_initialized = .true.
206 <    return
207 <  end subroutine set_gb_pair_params
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 +    do i = 1, nGBtypes
223 +
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 +       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 +
238 +          GBMixingMap(i,j)%sigma0 = sqrt(d1*d1 + d2*d2)
239 +          GBMixingMap(i,j)%xa2 = (l1*l1 - d1*d1)/(l1*l1 + d2*d2)
240 +          GBMixingMap(i,j)%xai2 = (l2*l2 - d2*d2)/(l2*l2 + d1*d1)
241 +          GBMixingMap(i,j)%x2 = (l1*l1 - d1*d1) * (l2*l2 - d2*d2) / &
242 +               ((l2*l2 + d1*d1) * (l1*l1 + d2*d2))
243 +
244 +          ! assumed LB mixing rules for now:
245 +
246 +          GBMixingMap(i,j)%dw = 0.5_dp * (dw1 + dw2)
247 +          GBMixingMap(i,j)%eps0 = sqrt(e1 * e2)
248 +
249 +          er = sqrt(er1 * er2)
250 +          ermu = er**(1.0_dp / mu)
251 +          xp = (1.0_dp - ermu) / (1.0_dp + ermu)
252 +          ap2 = 1.0_dp / (1.0_dp + ermu)
253 +
254 +          GBMixingMap(i,j)%xp2 = xp*xp
255 +          GBMixingMap(i,j)%xpap2 = xp*ap2
256 +          GBMixingMap(i,j)%xpapi2 = xp/ap2
257 +          
258 +          if (i.ne.j) then
259 +             GBMixingMap(j,i)%sigma0 = GBMixingMap(i,j)%sigma0
260 +             GBMixingMap(j,i)%dw     = GBMixingMap(i,j)%dw    
261 +             GBMixingMap(j,i)%eps0   = GBMixingMap(i,j)%eps0  
262 +             GBMixingMap(j,i)%x2     = GBMixingMap(i,j)%x2    
263 +             GBMixingMap(j,i)%xa2    = GBMixingMap(i,j)%xa2  
264 +             GBMixingMap(j,i)%xai2   = GBMixingMap(i,j)%xai2  
265 +             GBMixingMap(j,i)%xp2    = GBMixingMap(i,j)%xp2  
266 +             GBMixingMap(j,i)%xpap2  = GBMixingMap(i,j)%xpap2
267 +             GBMixingMap(j,i)%xpapi2 = GBMixingMap(i,j)%xpapi2
268 +          endif
269 +       enddo
270 +    enddo
271 +    haveMixingMap = .true.
272 +    mu = getGayBerneMu()
273 +    nu = getGayBerneNu()    
274 +  end subroutine createGBMixingMap
275 +  
276 +
277    !! gay berne cutoff should be a parameter in globals, this is a temporary
278    !! work around - this should be fixed when gay berne is up and running
279 +
280    function getGayBerneCut(atomID) result(cutValue)
281 <    integer, intent(in) :: atomID !! nah... we don't need to use this...
282 <    real(kind=dp) :: cutValue
281 >    integer, intent(in) :: atomID
282 >    integer :: gbt1
283 >    real(kind=dp) :: cutValue, l, d
284  
285 <    cutValue = gb_l2b_ratio*gb_sigma*2.5_dp
285 >    if (GBMap%currentGBtype == 0) then
286 >       call handleError("GB", "No members in GBMap")
287 >       return
288 >    end if
289 >
290 >    gbt1 = GBMap%atidToGBtype(atomID)
291 >    l = GBMap%GBtypes(gbt1)%l
292 >    d = GBMap%GBtypes(gbt1)%d  
293 >    cutValue = 2.5_dp*max(l,d)
294 >
295    end function getGayBerneCut
296  
297    subroutine do_gb_pair(atom1, atom2, d, r, r2, sw, vpair, fpair, &
298 <       pot, A, f, t, do_pot)
298 >       pot, Amat, f, t, do_pot)
299      
300      integer, intent(in) :: atom1, atom2
301 <    integer :: id1, id2
301 >    integer :: atid1, atid2, gbt1, gbt2, id1, id2
302      real (kind=dp), intent(inout) :: r, r2
303      real (kind=dp), dimension(3), intent(in) :: d
304      real (kind=dp), dimension(3), intent(inout) :: fpair
305      real (kind=dp) :: pot, sw, vpair
306 <    real (kind=dp), dimension(9,nLocal) :: A
306 >    real (kind=dp), dimension(9,nLocal) :: Amat
307      real (kind=dp), dimension(3,nLocal) :: f
308      real (kind=dp), dimension(3,nLocal) :: t
309      logical, intent(in) :: do_pot
310 <    real (kind = dp), dimension(3) :: ul1
117 <    real (kind = dp), dimension(3) :: ul2
310 >    real (kind = dp), dimension(3) :: ul1, ul2, rxu1, rxu2, uxu, rhat
311  
312 <    real(kind=dp) :: chi, chiprime, emu, s2
313 <    real(kind=dp) :: r4, rdotu1, rdotu2, u1dotu2, g, gp, gpi, gmu, gmum
314 <    real(kind=dp) :: curlyE, enu, enum, eps, dotsum, dotdiff, ds2, dd2
315 <    real(kind=dp) :: opXdot, omXdot, opXpdot, omXpdot, pref, gfact
316 <    real(kind=dp) :: BigR, Ri, Ri2, Ri6, Ri7, Ri12, Ri13, R126, R137
124 <    real(kind=dp) :: dru1dx, dru1dy, dru1dz
125 <    real(kind=dp) :: dru2dx, dru2dy, dru2dz
126 <    real(kind=dp) :: dBigRdx, dBigRdy, dBigRdz
127 <    real(kind=dp) :: dBigRdu1x, dBigRdu1y, dBigRdu1z
128 <    real(kind=dp) :: dBigRdu2x, dBigRdu2y, dBigRdu2z
129 <    real(kind=dp) :: dUdx, dUdy, dUdz
130 <    real(kind=dp) :: dUdu1x, dUdu1y, dUdu1z, dUdu2x, dUdu2y, dUdu2z
131 <    real(kind=dp) :: dcE, dcEdu1x, dcEdu1y, dcEdu1z, dcEdu2x, dcEdu2y, dcEdu2z
132 <    real(kind=dp) :: depsdu1x, depsdu1y, depsdu1z, depsdu2x, depsdu2y, depsdu2z
133 <    real(kind=dp) :: drdx, drdy, drdz
134 <    real(kind=dp) :: dgdx, dgdy, dgdz
135 <    real(kind=dp) :: dgdu1x, dgdu1y, dgdu1z, dgdu2x, dgdu2y, dgdu2z
136 <    real(kind=dp) :: dgpdx, dgpdy, dgpdz
137 <    real(kind=dp) :: dgpdu1x, dgpdu1y, dgpdu1z, dgpdu2x, dgpdu2y, dgpdu2z
138 <    real(kind=dp) :: line1a, line1bx, line1by, line1bz
139 <    real(kind=dp) :: line2a, line2bx, line2by, line2bz
140 <    real(kind=dp) :: line3a, line3b, line3, line3x, line3y, line3z
141 <    real(kind=dp) :: term1x, term1y, term1z, term1u1x, term1u1y, term1u1z
142 <    real(kind=dp) :: term1u2x, term1u2y, term1u2z
143 <    real(kind=dp) :: term2a, term2b, term2u1x, term2u1y, term2u1z
144 <    real(kind=dp) :: term2u2x, term2u2y, term2u2z
145 <    real(kind=dp) :: yick1, yick2, mess1, mess2
146 <    
147 <    s2 = (gb_l2b_ratio)**2
148 <    emu = (gb_eps_ratio)**(1.0d0/gb_mu)
312 >    real (kind = dp) :: sigma0, dw, eps0, x2, xa2, xai2, xp2, xpap2, xpapi2
313 >    real (kind = dp) :: e1, e2, eps, sigma, s3, s03, au, bu, a, b, g, g2
314 >    real (kind = dp) :: U, BigR, R3, R6, R7, R12, R13, H, Hp, fx, fy, fz
315 >    real (kind = dp) :: dUdr, dUda, dUdb, dUdg, pref1, pref2
316 >    logical :: i_is_lj, j_is_lj
317  
318 <    chi = (s2 - 1.0d0)/(s2 + 1.0d0)
319 <    chiprime = (1.0d0 - emu)/(1.0d0 + emu)
318 >    if (.not.haveMixingMap) then
319 >       call createGBMixingMap()
320 >    endif
321  
322 <    r4 = r2*r2
322 > #ifdef IS_MPI
323 >    atid1 = atid_Row(atom1)
324 >    atid2 = atid_Col(atom2)
325 > #else
326 >    atid1 = atid(atom1)
327 >    atid2 = atid(atom2)
328 > #endif
329  
330 +    gbt1 = GBMap%atidToGBtype(atid1)
331 +    gbt2 = GBMap%atidToGBtype(atid2)    
332 +
333 +    i_is_LJ = GBMap%GBTypes(gbt1)%isLJ
334 +    j_is_LJ = GBMap%GBTypes(gbt2)%isLJ
335 +
336 +    sigma0 = GBMixingMap(gbt1, gbt2)%sigma0
337 +    dw     = GBMixingMap(gbt1, gbt2)%dw    
338 +    eps0   = GBMixingMap(gbt1, gbt2)%eps0  
339 +    x2     = GBMixingMap(gbt1, gbt2)%x2    
340 +    xa2    = GBMixingMap(gbt1, gbt2)%xa2  
341 +    xai2   = GBMixingMap(gbt1, gbt2)%xai2  
342 +    xp2    = GBMixingMap(gbt1, gbt2)%xp2  
343 +    xpap2  = GBMixingMap(gbt1, gbt2)%xpap2
344 +    xpapi2 = GBMixingMap(gbt1, gbt2)%xpapi2
345 +    
346   #ifdef IS_MPI
347 <    ul1(1) = A_Row(3,atom1)
348 <    ul1(2) = A_Row(6,atom1)
347 >    ul1(1) = A_Row(7,atom1)
348 >    ul1(2) = A_Row(8,atom1)
349      ul1(3) = A_Row(9,atom1)
350  
351 <    ul2(1) = A_Col(3,atom2)
352 <    ul2(2) = A_Col(6,atom2)
351 >    ul2(1) = A_Col(7,atom2)
352 >    ul2(2) = A_Col(8,atom2)
353      ul2(3) = A_Col(9,atom2)
354   #else
355 <    ul1(1) = A(3,atom1)
356 <    ul1(2) = A(6,atom1)
357 <    ul1(3) = A(9,atom1)
355 >    ul1(1) = Amat(7,atom1)
356 >    ul1(2) = Amat(8,atom1)
357 >    ul1(3) = Amat(9,atom1)
358  
359 <    ul2(1) = A(3,atom2)
360 <    ul2(2) = A(6,atom2)
361 <    ul2(3) = A(9,atom2)
359 >    ul2(1) = Amat(7,atom2)
360 >    ul2(2) = Amat(8,atom2)
361 >    ul2(3) = Amat(9,atom2)
362   #endif
363      
364 <    dru1dx = ul1(1)
365 <    dru2dx = ul2(1)
366 <    dru1dy = ul1(2)
367 <    dru2dy = ul2(2)
368 <    dru1dz = ul1(3)
369 <    dru2dz = ul2(3)
179 <    
180 <    drdx = d(1) / r
181 <    drdy = d(2) / r
182 <    drdz = d(3) / r
183 <    
184 <    ! do some dot products:
185 <    ! NB the r in these dot products is the actual intermolecular vector,
186 <    ! and is not the unit vector in that direction.
187 <    
188 <    rdotu1 = d(1)*ul1(1) + d(2)*ul1(2) + d(3)*ul1(3)
189 <    rdotu2 = d(1)*ul2(1) + d(2)*ul2(2) + d(3)*ul2(3)
190 <    u1dotu2 = ul1(1)*ul2(1) + ul1(2)*ul2(2) +  ul1(3)*ul2(3)
364 >    if (i_is_LJ) then
365 >       a = 0.0_dp
366 >       ul1 = 0.0_dp
367 >    else
368 >       a = d(1)*ul1(1)   + d(2)*ul1(2)   + d(3)*ul1(3)
369 >    endif
370  
371 <    ! This stuff is all for the calculation of g(Chi) and dgdx
372 <    ! Line numbers roughly follow the lines in equation A25 of Luckhurst
373 <    !   et al. Liquid Crystals 8, 451-464 (1990).
374 <    ! We note however, that there are some major typos in that Appendix
375 <    ! of the Luckhurst paper, particularly in equations A23, A29 and A31
376 <    ! We have attempted to correct them below.
198 <    
199 <    dotsum = rdotu1+rdotu2
200 <    dotdiff = rdotu1-rdotu2
201 <    ds2 = dotsum*dotsum
202 <    dd2 = dotdiff*dotdiff
203 <  
204 <    opXdot = 1.0d0 + Chi*u1dotu2
205 <    omXdot = 1.0d0 - Chi*u1dotu2
206 <    opXpdot = 1.0d0 + ChiPrime*u1dotu2
207 <    omXpdot = 1.0d0 - ChiPrime*u1dotu2
208 <  
209 <    line1a = dotsum/opXdot
210 <    line1bx = dru1dx + dru2dx
211 <    line1by = dru1dy + dru2dy
212 <    line1bz = dru1dz + dru2dz
213 <    
214 <    line2a = dotdiff/omXdot
215 <    line2bx = dru1dx - dru2dx
216 <    line2by = dru1dy - dru2dy
217 <    line2bz = dru1dz - dru2dz
218 <    
219 <    term1x = -Chi*(line1a*line1bx + line2a*line2bx)/r2
220 <    term1y = -Chi*(line1a*line1by + line2a*line2by)/r2
221 <    term1z = -Chi*(line1a*line1bz + line2a*line2bz)/r2
222 <    
223 <    line3a = ds2/opXdot
224 <    line3b = dd2/omXdot
225 <    line3 = Chi*(line3a + line3b)/r4
226 <    line3x = d(1)*line3
227 <    line3y = d(2)*line3
228 <    line3z = d(3)*line3
229 <    
230 <    dgdx = term1x + line3x
231 <    dgdy = term1y + line3y
232 <    dgdz = term1z + line3z
371 >    if (j_is_LJ) then
372 >       b = 0.0_dp
373 >       ul2 = 0.0_dp
374 >    else      
375 >       b = d(1)*ul2(1)   + d(2)*ul2(2)   + d(3)*ul2(3)
376 >    endif
377  
378 <    term1u1x = (line1a+line2a)*dru1dx
379 <    term1u1y = (line1a+line2a)*dru1dy
380 <    term1u1z = (line1a+line2a)*dru1dz
381 <    term1u2x = (line1a-line2a)*dru2dx
382 <    term1u2y = (line1a-line2a)*dru2dy
239 <    term1u2z = (line1a-line2a)*dru2dz
240 <    
241 <    term2a = -line3a/opXdot
242 <    term2b =  line3b/omXdot
243 <    
244 <    term2u1x = Chi*ul2(1)*(term2a + term2b)
245 <    term2u1y = Chi*ul2(2)*(term2a + term2b)
246 <    term2u1z = Chi*ul2(3)*(term2a + term2b)
247 <    term2u2x = Chi*ul1(1)*(term2a + term2b)
248 <    term2u2y = Chi*ul1(2)*(term2a + term2b)
249 <    term2u2z = Chi*ul1(3)*(term2a + term2b)
250 <    
251 <    pref = -Chi*0.5d0/r2
378 >    if (i_is_LJ.or.j_is_LJ) then
379 >       g = 0.0_dp
380 >    else
381 >       g = ul1(1)*ul2(1) + ul1(2)*ul2(2) + ul1(3)*ul2(3)
382 >    endif
383  
384 <    dgdu1x = pref*(term1u1x+term2u1x)
385 <    dgdu1y = pref*(term1u1y+term2u1y)
386 <    dgdu1z = pref*(term1u1z+term2u1z)
256 <    dgdu2x = pref*(term1u2x+term2u2x)
257 <    dgdu2y = pref*(term1u2y+term2u2y)
258 <    dgdu2z = pref*(term1u2z+term2u2z)
384 >    au = a / r
385 >    bu = b / r
386 >    g2 = g*g
387  
388 <    g = 1.0d0 - Chi*(line3a + line3b)/(2.0d0*r2)
389 <  
390 <    BigR = (r - gb_sigma*(g**(-0.5d0)) + gb_sigma)/gb_sigma
391 <    Ri = 1.0d0/BigR
392 <    Ri2 = Ri*Ri
393 <    Ri6 = Ri2*Ri2*Ri2
394 <    Ri7 = Ri6*Ri
395 <    Ri12 = Ri6*Ri6
396 <    Ri13 = Ri6*Ri7
388 >    H  = (xa2 * au + xai2 * bu - 2.0_dp*x2*au*bu*g)  / (1.0_dp - x2*g2)
389 >    Hp = (xpap2*au + xpapi2*bu - 2.0_dp*xp2*au*bu*g) / (1.0_dp - xp2*g2)
390 >    sigma = sigma0 / sqrt(1.0_dp - H)
391 >    e1 = 1.0_dp / sqrt(1.0_dp - x2*g2)
392 >    e2 = 1.0_dp - Hp
393 >    eps = eps0 * (e1**nu) * (e2**mu)
394 >    BigR = dw*sigma0 / (r - sigma + dw*sigma0)
395 >    
396 >    R3 = BigR*BigR*BigR
397 >    R6 = R3*R3
398 >    R7 = R6 * BigR
399 >    R12 = R6*R6
400 >    R13 = R6*R7
401  
402 <    gfact = (g**(-1.5d0))*0.5d0
402 >    U = 4.0_dp * eps * (R12 - R6)
403  
404 <    dBigRdx = drdx/gb_sigma + dgdx*gfact
405 <    dBigRdy = drdy/gb_sigma + dgdy*gfact
274 <    dBigRdz = drdz/gb_sigma + dgdz*gfact
404 >    s3 = sigma*sigma*sigma
405 >    s03 = sigma0*sigma0*sigma0
406  
407 <    dBigRdu1x = dgdu1x*gfact
277 <    dBigRdu1y = dgdu1y*gfact
278 <    dBigRdu1z = dgdu1z*gfact
279 <    dBigRdu2x = dgdu2x*gfact
280 <    dBigRdu2y = dgdu2y*gfact
281 <    dBigRdu2z = dgdu2z*gfact
407 >    pref1 = - 8.0_dp * eps * mu * (R12 - R6) / (e2 * r)
408  
409 <    ! Now, we must do it again for g(ChiPrime) and dgpdx
409 >    pref2 = 8.0_dp * eps * s3 * (6.0_dp*R13 - 3.0_dp*R7) / (dw*r*s03)
410  
411 <    line1a = dotsum/opXpdot
286 <    line2a = dotdiff/omXpdot
287 <    term1x = -ChiPrime*(line1a*line1bx + line2a*line2bx)/r2
288 <    term1y = -ChiPrime*(line1a*line1by + line2a*line2by)/r2
289 <    term1z = -ChiPrime*(line1a*line1bz + line2a*line2bz)/r2
290 <    line3a = ds2/opXpdot
291 <    line3b = dd2/omXpdot
292 <    line3 = ChiPrime*(line3a + line3b)/r4
293 <    line3x = d(1)*line3
294 <    line3y = d(2)*line3
295 <    line3z = d(3)*line3
411 >    dUdr = - (pref1 * Hp + pref2 * (sigma0*sigma0*r/s3 - H))
412      
413 <    dgpdx = term1x + line3x
414 <    dgpdy = term1y + line3y
299 <    dgpdz = term1z + line3z
413 >    dUda = pref1 * (xpap2*au - xp2*bu*g) / (1.0_dp - xp2 * g2) &
414 >         + pref2 * (xa2 * au - x2 *bu*g) / (1.0_dp - x2 * g2)
415      
416 <    term1u1x = (line1a+line2a)*dru1dx
417 <    term1u1y = (line1a+line2a)*dru1dy
303 <    term1u1z = (line1a+line2a)*dru1dz
304 <    term1u2x = (line1a-line2a)*dru2dx
305 <    term1u2y = (line1a-line2a)*dru2dy
306 <    term1u2z = (line1a-line2a)*dru2dz
416 >    dUdb = pref1 * (xpapi2*bu - xp2*au*g) / (1.0_dp - xp2 * g2) &
417 >         + pref2 * (xai2 * bu - x2 *au*g) / (1.0_dp - x2 * g2)
418  
419 <    term2a = -line3a/opXpdot
420 <    term2b =  line3b/omXpdot
421 <    
422 <    term2u1x = ChiPrime*ul2(1)*(term2a + term2b)
423 <    term2u1y = ChiPrime*ul2(2)*(term2a + term2b)
424 <    term2u1z = ChiPrime*ul2(3)*(term2a + term2b)
425 <    term2u2x = ChiPrime*ul1(1)*(term2a + term2b)
315 <    term2u2y = ChiPrime*ul1(2)*(term2a + term2b)
316 <    term2u2z = ChiPrime*ul1(3)*(term2a + term2b)
317 <  
318 <    pref = -ChiPrime*0.5d0/r2
319 <    
320 <    dgpdu1x = pref*(term1u1x+term2u1x)
321 <    dgpdu1y = pref*(term1u1y+term2u1y)
322 <    dgpdu1z = pref*(term1u1z+term2u1z)
323 <    dgpdu2x = pref*(term1u2x+term2u2x)
324 <    dgpdu2y = pref*(term1u2y+term2u2y)
325 <    dgpdu2z = pref*(term1u2z+term2u2z)
326 <    
327 <    gp = 1.0d0 - ChiPrime*(line3a + line3b)/(2.0d0*r2)
328 <    gmu = gp**gb_mu
329 <    gpi = 1.0d0 / gp
330 <    gmum = gmu*gpi
419 >    dUdg = 4.0_dp * eps * nu * (R12 - R6) * x2 * g / (1.0_dp - x2*g2) &
420 >         + 8.0_dp * eps * mu * (R12 - R6) * (xp2*au*bu - Hp*xp2*g) / &
421 >         (1.0_dp - xp2 * g2) / e2 &
422 >         + 8.0_dp * eps * s3 * (3.0_dp * R7 - 6.0_dp * R13) * &  
423 >         (x2 * au * bu - H * x2 * g) / (1.0_dp - x2 * g2) / (dw * s03)
424 >            
425 >    rhat = d / r
426  
427 <    curlyE = 1.0d0/dsqrt(1.0d0 - Chi*Chi*u1dotu2*u1dotu2)
427 >    fx = dUdr * rhat(1) + dUda * ul1(1) + dUdb * ul2(1)
428 >    fy = dUdr * rhat(2) + dUda * ul1(2) + dUdb * ul2(2)
429 >    fz = dUdr * rhat(3) + dUda * ul1(3) + dUdb * ul2(3)    
430  
431 <    dcE = (curlyE**3)*Chi*Chi*u1dotu2
432 <  
433 <    dcEdu1x = dcE*ul2(1)
434 <    dcEdu1y = dcE*ul2(2)
435 <    dcEdu1z = dcE*ul2(3)
436 <    dcEdu2x = dcE*ul1(1)
437 <    dcEdu2y = dcE*ul1(2)
438 <    dcEdu2z = dcE*ul1(3)
342 <    
343 <    enu = curlyE**gb_nu
344 <    enum = enu/curlyE
345 <  
346 <    eps = gb_eps*enu*gmu
431 >    rxu1 = cross_product(d, ul1)
432 >    rxu2 = cross_product(d, ul2)    
433 >    uxu = cross_product(ul1, ul2)
434 >          
435 > !!$    write(*,*) 'rxu1 = ' , rxu1(1), rxu1(2), rxu1(3)
436 > !!$    write(*,*) 'rxu2 = ' , rxu2(1), rxu2(2), rxu2(3)
437 > !!$    write(*,*) 'uxu = ' , uxu(1), uxu(2), uxu(3)
438 > !!$    write(*,*) 'dUda = ', dUda, dudb, dudg
439  
348    yick1 = gb_eps*enu*gb_mu*gmum
349    yick2 = gb_eps*gmu*gb_nu*enum
440  
351    depsdu1x = yick1*dgpdu1x + yick2*dcEdu1x
352    depsdu1y = yick1*dgpdu1y + yick2*dcEdu1y
353    depsdu1z = yick1*dgpdu1z + yick2*dcEdu1z
354    depsdu2x = yick1*dgpdu2x + yick2*dcEdu2x
355    depsdu2y = yick1*dgpdu2y + yick2*dcEdu2y
356    depsdu2z = yick1*dgpdu2z + yick2*dcEdu2z
357    
358    R126 = Ri12 - Ri6
359    R137 = 6.0d0*Ri7 - 12.0d0*Ri13
360    
361    mess1 = gmu*R137
362    mess2 = R126*gb_mu*gmum
363    
364    dUdx = 4.0d0*gb_eps*enu*(mess1*dBigRdx + mess2*dgpdx)*sw
365    dUdy = 4.0d0*gb_eps*enu*(mess1*dBigRdy + mess2*dgpdy)*sw
366    dUdz = 4.0d0*gb_eps*enu*(mess1*dBigRdz + mess2*dgpdz)*sw
367    
368    dUdu1x = 4.0d0*(R126*depsdu1x + eps*R137*dBigRdu1x)*sw
369    dUdu1y = 4.0d0*(R126*depsdu1y + eps*R137*dBigRdu1y)*sw
370    dUdu1z = 4.0d0*(R126*depsdu1z + eps*R137*dBigRdu1z)*sw
371    dUdu2x = 4.0d0*(R126*depsdu2x + eps*R137*dBigRdu2x)*sw
372    dUdu2y = 4.0d0*(R126*depsdu2y + eps*R137*dBigRdu2y)*sw
373    dUdu2z = 4.0d0*(R126*depsdu2z + eps*R137*dBigRdu2z)*sw
374      
441   #ifdef IS_MPI
442 <    f_Row(1,atom1) = f_Row(1,atom1) + dUdx
443 <    f_Row(2,atom1) = f_Row(2,atom1) + dUdy
444 <    f_Row(3,atom1) = f_Row(3,atom1) + dUdz
442 >    f_Row(1,atom1) = f_Row(1,atom1) + fx
443 >    f_Row(2,atom1) = f_Row(2,atom1) + fy
444 >    f_Row(3,atom1) = f_Row(3,atom1) + fz
445      
446 <    f_Col(1,atom2) = f_Col(1,atom2) - dUdx
447 <    f_Col(2,atom2) = f_Col(2,atom2) - dUdy
448 <    f_Col(3,atom2) = f_Col(3,atom2) - dUdz
446 >    f_Col(1,atom2) = f_Col(1,atom2) - fx
447 >    f_Col(2,atom2) = f_Col(2,atom2) - fy
448 >    f_Col(3,atom2) = f_Col(3,atom2) - fz
449      
450 <    t_Row(1,atom1) = t_Row(1,atom1) - ul1(2)*dUdu1z + ul1(3)*dUdu1y
451 <    t_Row(2,atom1) = t_Row(2,atom1) - ul1(3)*dUdu1x + ul1(1)*dUdu1z
452 <    t_Row(3,atom1) = t_Row(3,atom1) - ul1(1)*dUdu1y + ul1(2)*dUdu1x
453 <    
454 <    t_Col(1,atom2) = t_Col(1,atom2) - ul2(2)*dUdu2z + ul2(3)*dUdu2y
455 <    t_Col(2,atom2) = t_Col(2,atom2) - ul2(3)*dUdu2x + ul2(1)*dUdu2z
456 <    t_Col(3,atom2) = t_Col(3,atom2) - ul2(1)*dUdu2y + ul2(2)*dUdu2x
450 >    t_Row(1,atom1) = t_Row(1,atom1) + dUda*rxu1(1) - dUdg*uxu(1)
451 >    t_Row(2,atom1) = t_Row(2,atom1) + dUda*rxu1(2) - dUdg*uxu(2)
452 >    t_Row(3,atom1) = t_Row(3,atom1) + dUda*rxu1(3) - dUdg*uxu(3)
453 >                                                                
454 >    t_Col(1,atom2) = t_Col(1,atom2) + dUdb*rxu2(1) + dUdg*uxu(1)
455 >    t_Col(2,atom2) = t_Col(2,atom2) + dUdb*rxu2(2) + dUdg*uxu(2)
456 >    t_Col(3,atom2) = t_Col(3,atom2) + dUdb*rxu2(3) + dUdg*uxu(3)
457   #else
458 <    f(1,atom1) = f(1,atom1) + dUdx
459 <    f(2,atom1) = f(2,atom1) + dUdy
460 <    f(3,atom1) = f(3,atom1) + dUdz
458 >    f(1,atom1) = f(1,atom1) + fx
459 >    f(2,atom1) = f(2,atom1) + fy
460 >    f(3,atom1) = f(3,atom1) + fz
461      
462 <    f(1,atom2) = f(1,atom2) - dUdx
463 <    f(2,atom2) = f(2,atom2) - dUdy
464 <    f(3,atom2) = f(3,atom2) - dUdz
462 >    f(1,atom2) = f(1,atom2) - fx
463 >    f(2,atom2) = f(2,atom2) - fy
464 >    f(3,atom2) = f(3,atom2) - fz
465      
466 <    t(1,atom1) = t(1,atom1) - ul1(2)*dUdu1z + ul1(3)*dUdu1y
467 <    t(2,atom1) = t(2,atom1) - ul1(3)*dUdu1x + ul1(1)*dUdu1z
468 <    t(3,atom1) = t(3,atom1) - ul1(1)*dUdu1y + ul1(2)*dUdu1x
469 <    
470 <    t(1,atom2) = t(1,atom2) - ul2(2)*dUdu2z + ul2(3)*dUdu2y
471 <    t(2,atom2) = t(2,atom2) - ul2(3)*dUdu2x + ul2(1)*dUdu2z
472 <    t(3,atom2) = t(3,atom2) - ul2(1)*dUdu2y + ul2(2)*dUdu2x
466 >    t(1,atom1) = t(1,atom1) +  dUda*rxu1(1) - dUdg*uxu(1)
467 >    t(2,atom1) = t(2,atom1) +  dUda*rxu1(2) - dUdg*uxu(2)
468 >    t(3,atom1) = t(3,atom1) +  dUda*rxu1(3) - dUdg*uxu(3)
469 >                                                        
470 >    t(1,atom2) = t(1,atom2) +  dUdb*rxu2(1) + dUdg*uxu(1)
471 >    t(2,atom2) = t(2,atom2) +  dUdb*rxu2(2) + dUdg*uxu(2)
472 >    t(3,atom2) = t(3,atom2) +  dUdb*rxu2(3) + dUdg*uxu(3)
473   #endif
474 <            
474 >  
475      if (do_pot) then
476   #ifdef IS_MPI
477 <       pot_row(GAYBERNE_POT,atom1) = pot_row(GAYBERNE_POT,atom1) + 2.0d0*eps*R126*sw
478 <       pot_col(GAYBERNE_POT,atom2) = pot_col(GAYBERNE_POT,atom2) + 2.0d0*eps*R126*sw
477 >       pot_row(VDW_POT,atom1) = pot_row(VDW_POT,atom1) + 0.5d0*U*sw
478 >       pot_col(VDW_POT,atom2) = pot_col(VDW_POT,atom2) + 0.5d0*U*sw
479   #else
480 <       pot = pot + 4.0*eps*R126*sw
480 >       pot = pot + U*sw
481   #endif
482      endif
483 <
484 <    vpair = vpair + 4.0*eps*R126
483 >    
484 >    vpair = vpair + U*sw
485   #ifdef IS_MPI
486      id1 = AtomRowToGlobal(atom1)
487      id2 = AtomColToGlobal(atom2)
# Line 426 | Line 492 | contains
492      
493      if (molMembershipList(id1) .ne. molMembershipList(id2)) then
494        
495 <       fpair(1) = fpair(1) + dUdx
496 <       fpair(2) = fpair(2) + dUdy
497 <       fpair(3) = fpair(3) + dUdz
495 >       fpair(1) = fpair(1) + fx
496 >       fpair(2) = fpair(2) + fy
497 >       fpair(3) = fpair(3) + fz
498        
499      endif
500      
501      return
502    end subroutine do_gb_pair
503 +  
504 +  subroutine destroyGBTypes()
505  
506 < end module gb_pair
506 >    GBMap%nGBtypes = 0
507 >    GBMap%currentGBtype = 0
508 >    
509 >    if (associated(GBMap%GBtypes)) then
510 >       deallocate(GBMap%GBtypes)
511 >       GBMap%GBtypes => null()
512 >    end if
513 >    
514 >    if (associated(GBMap%atidToGBtype)) then
515 >       deallocate(GBMap%atidToGBtype)
516 >       GBMap%atidToGBtype => null()
517 >    end if
518 >    
519 >    haveMixingMap = .false.
520 >    
521 >  end subroutine destroyGBTypes
522 >
523 > end module gayberne
524 >    

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines