ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/DarkSide/gb.F90
Revision: 2367
Committed: Fri Oct 14 15:44:37 2005 UTC (18 years, 8 months ago) by kdaily
File size: 28383 byte(s)
Log Message:
Add parts for the GayBerne LJ

File Contents

# Content
1 !!
2 !! Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 !!
4 !! The University of Notre Dame grants you ("Licensee") a
5 !! non-exclusive, royalty free, license to use, modify and
6 !! redistribute this software in source and binary code form, provided
7 !! that the following conditions are met:
8 !!
9 !! 1. Acknowledgement of the program authors must be made in any
10 !! publication of scientific results based in part on use of the
11 !! program. An acceptable form of acknowledgement is citation of
12 !! the article in which the program was described (Matthew
13 !! A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 !! J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 !! Parallel Simulation Engine for Molecular Dynamics,"
16 !! J. Comput. Chem. 26, pp. 252-271 (2005))
17 !!
18 !! 2. Redistributions of source code must retain the above copyright
19 !! notice, this list of conditions and the following disclaimer.
20 !!
21 !! 3. Redistributions in binary form must reproduce the above copyright
22 !! notice, this list of conditions and the following disclaimer in the
23 !! documentation and/or other materials provided with the
24 !! distribution.
25 !!
26 !! This software is provided "AS IS," without a warranty of any
27 !! kind. All express or implied conditions, representations and
28 !! warranties, including any implied warranty of merchantability,
29 !! fitness for a particular purpose or non-infringement, are hereby
30 !! excluded. The University of Notre Dame and its licensors shall not
31 !! be liable for any damages suffered by licensee as a result of
32 !! using, modifying or distributing the software or its
33 !! derivatives. In no event will the University of Notre Dame or its
34 !! licensors be liable for any lost revenue, profit or data, or for
35 !! direct, indirect, special, consequential, incidental or punitive
36 !! damages, however caused and regardless of the theory of liability,
37 !! arising out of the use of or inability to use software, even if the
38 !! University of Notre Dame has been advised of the possibility of
39 !! such damages.
40 !!
41
42
43 module gb_pair
44 use force_globals
45 use definitions
46 use simulation
47 use atype_module
48 use vector_class
49 use status
50 use lj
51 #ifdef IS_MPI
52 use mpiSimulation
53 #endif
54
55 implicit none
56
57 private
58
59 logical, save :: haveGayBerneLJMap = .false.
60 logical, save :: gb_pair_initialized = .false.
61 logical, save :: gb_lj_pair_initialized = .false.
62 real(kind=dp), save :: gb_sigma
63 real(kind=dp), save :: gb_l2b_ratio
64 real(kind=dp), save :: gb_eps
65 real(kind=dp), save :: gb_eps_ratio
66 real(kind=dp), save :: gb_mu
67 real(kind=dp), save :: gb_nu
68 real(kind=dp), save :: lj_sigma
69 real(kind=dp), save :: lj_eps
70 real(kind=dp), save :: gb_sigma_l
71 real(kind=dp), save :: gb_eps_l
72
73 public :: check_gb_pair_FF
74 public :: set_gb_pair_params
75 public :: do_gb_pair
76 public :: getGayBerneCut
77 !!$ public :: check_gb_lj_pair_FF
78 !!$ public :: set_gb_lj_pair_params
79 public :: do_gb_lj_pair
80 public :: createGayBerneLJMap
81 public :: destroyGayBerneTypes
82 public :: complete_GayBerne_FF
83 !!may not need
84 type, private :: LJtype
85 integer :: atid
86 real(kind=dp) :: sigma
87 real(kind=dp) :: epsilon
88 end type LJtype
89 !!may not need
90 type, private :: LJList
91 integer :: Nljtypes =0
92 integer :: currentLJtype= 0
93 type(LJtype), pointer :: LJtype(:) => null()
94 integer, pointer :: atidToLJtype(:) =>null()
95 end type LJList
96
97 type(LJList), save :: LJMap
98
99 type :: GayBerneLJ
100 !!$ integer :: atid
101 !!$ real(kind = dp ),pointer, dimension(:) :: epsil_GB =>null()
102 !!$ real(kind = dp ),pointer, dimension(:) :: sigma_GB =>null()
103 !!$ real(kind = dp ),pointer, dimension(:) :: epsilon_ratio =>null()
104 !!$ real(kind = dp ),pointer, dimension(:) :: sigma_ratio =>null()
105 !!$ real(kind = dp ),pointer, dimension(:) :: mu =>null()
106
107 real(kind = dp ) :: sigma_l
108 real(kind = dp ) :: sigma_s
109 real(kind = dp ) :: sigma_ratio
110 real(kind = dp ) :: eps_s
111 real(kind = dp ) :: eps_l
112 real(kind = dp ) :: eps_ratio
113 integer :: c_ident
114 integer :: status
115 end type GayBerneLJ
116
117 !!$ type, private :: gayberneLJlist
118 !!$ integer:: n_gaybernelj = 0
119 !!$ integer:: currentgayberneLJ = 0
120 !!$ type(GayBerneLJ),pointer :: GayBerneLJ(:) => null()
121 !!$ integer, pointer :: atidToGayBerneLJ(:) => null()
122 !!$ end type gayberneLJlist
123
124 type(gayberneLJ), dimension(:), allocatable :: gayBerneLJMap
125
126 contains
127
128 subroutine check_gb_pair_FF(status)
129 integer :: status
130 status = -1
131 if (gb_pair_initialized) status = 0
132 return
133 end subroutine check_gb_pair_FF
134
135 !!$ subroutine check_gb_lj_pair_FF(status)
136 !!$ integer :: status
137 !!$ status = -1
138 !!$ if (gb_lj_pair_initialized) status = 0
139 !!$ return
140 !!$ end subroutine check_gb_lj_pair_FF
141
142 subroutine set_gb_pair_params(sigma, l2b_ratio, eps, eps_ratio, mu, nu)
143 real( kind = dp ), intent(in) :: sigma, l2b_ratio, eps, eps_ratio
144 real( kind = dp ), intent(in) :: mu, nu
145 integer :: ntypes, nljtypes
146 !! integer, intent(in) :: c_ident
147 integer, pointer :: MatchList(:) => null ()
148 integer :: status
149 gb_sigma = sigma
150 gb_l2b_ratio = l2b_ratio
151 gb_eps = eps
152 gb_eps_ratio = eps_ratio
153 gb_mu = mu
154 gb_nu = nu
155 gb_sigma_l = gb_sigma*l2b_ratio
156 gb_eps_l = gb_eps*gb_eps_ratio
157 status = 0
158
159
160
161
162 return
163 end subroutine set_gb_pair_params
164
165 !!$ subroutine set_gb_lj_pair_params(sigma_gb, l2b_ratio, eps_gb, eps_ratio, mu, nu, sigma_lj, eps_lj, c_ident, status)
166 !!$ real( kind = dp ), intent(in) :: sigma_gb, l2b_ratio, eps_gb, eps_ratio, mu, nu
167 !!$ real( kind = dp ), intent(in) :: sigma_lj, eps_lj
168 !!$ integer, intent(in) :: c_ident
169 !!$ integer :: nLJTYPES, nGayBerneTypes, ntypes, current, status
170 !!$
171 !!$ integer :: myATID
172 !!$ logical :: thisProperty
173 !!$ real(kind=dp):: fake
174 !!$
175 !!$ status = 0
176 !!$
177 !!$ if(.not.associated(LJMap%Ljtype)) then
178
179 !!$ call getMatchingElementList(atypes, "is_GayBerne", .true., &
180 !!$ nGayBerneTypes, MatchList)
181 !!$
182 !!$ call getMatchingElementList(atypes, "is_LennardJones", .true., &
183 !!$ nLJTypes, MatchList)
184 !!$
185 !!$ LJMap%nLJtypes = nLJTypes
186 !!$
187 !!$ allocate(LJMap% LJtype(nLJTypes))
188 !!$
189 !!$ ntypes = getSize(atypes)
190 !!$
191 !!$ allocate(LJMap%atidToLJtype(ntypes))
192 !!$
193 !!$ endif
194 !!$
195 !!$ LJmap%currentLJtype = LJMap%currentLJtype + 1
196 !!$
197 !!$ current = LJMap%currentLJtype
198 !!$ LJMap%atidToLJtype(myATID) = current
199 !!$ myATID = getFirstMatchingElement(atypes, "c_ident", c_ident)
200 !!$ call getElementProperty(atypes, myATID, "is_LennardJones",thisProperty)
201 !!$ if(thisProperty) then
202 !!$
203 !!$ LJMap%LJtype(current)%atid = myatid
204 !!$!!for testing
205 !!$ fake = getSigma(myATID)
206 !!$ LJMap%LJtype(current)%sigma = getSigma(myATID)
207 !!$ LJMap%LJtype(current)%epsilon = getEpsilon(myATID)
208 !!$ end if
209
210 !!$ gb_sigma = sigma_gb
211 !!$ gb_l2b_ratio = l2b_ratio
212 !!$ gb_eps = eps_gb
213 !!$ gb_eps_ratio = eps_ratio
214 !! gb_mu = mu
215 !! gb_nu = nu
216 !!$
217 !!$ lj_sigma = sigma_lj
218 !!$ lj_eps = eps_lj
219
220 !! gb_lj_pair_initialized = .true.
221 !!$ endsubroutine set_gb_lj_pair_params
222
223 subroutine createGayBerneLJMap
224 integer :: ntypes, i, j
225 real(kind=dp) :: s1, s2, e1, e2
226 real(kind=dp) :: sigma_s,sigma_l,eps_s, eps_l
227
228 if(LJMap%currentLJtype == 0)then
229 call handleError("gayberneLJ", "no members in gayberneLJMap")
230 return
231 end if
232
233 ntypes = getSize(atypes)
234
235 if(.not.allocated(gayBerneLJMap))then
236 allocate(gayBerneLJMap(ntypes))
237 endif
238
239 do i = 1, ntypes
240 s1 = LJMap%LJtype(i)%sigma
241 e1 = LJMap%LJtype(i)%epsilon
242
243 !!$ sigma_s = 0.5d0 *(s1+gb_sigma)
244 !!$ sigma_l = 0.5d0 *(s1+gb_sigma*gb_l2b_ratio)
245 sigma_s = gb_sigma
246 sigma_l = gb_sigma*gb_l2b_ratio
247 gayBerneLJMap(i)%sigma_s = sigma_s
248 gayBerneLJMap(i)%sigma_l = sigma_l
249 gayBerneLJMap(i)%sigma_ratio = sigma_l/sigma_s
250 eps_s = dsqrt(e1*gb_eps)
251 eps_l = dsqrt(e1*gb_eps_l)
252 gayBerneLJMap(i)%eps_s = eps_s
253 gayBerneLJMap(i)%eps_l = eps_l
254 gayBerneLJMap(i)%eps_ratio = eps_l/eps_s
255 enddo
256 haveGayBerneLJMap = .true.
257 gb_lj_pair_initialized = .true.
258 endsubroutine createGayBerneLJMap
259 !! gay berne cutoff should be a parameter in globals, this is a temporary
260 !! work around - this should be fixed when gay berne is up and running
261 function getGayBerneCut(atomID) result(cutValue)
262 integer, intent(in) :: atomID !! nah... we don't need to use this...
263 real(kind=dp) :: cutValue
264
265 cutValue = gb_l2b_ratio*gb_sigma*2.5_dp
266 end function getGayBerneCut
267
268 subroutine do_gb_pair(atom1, atom2, d, r, r2, sw, vpair, fpair, &
269 pot, A, f, t, do_pot)
270
271 integer, intent(in) :: atom1, atom2
272 integer :: id1, id2
273 real (kind=dp), intent(inout) :: r, r2
274 real (kind=dp), dimension(3), intent(in) :: d
275 real (kind=dp), dimension(3), intent(inout) :: fpair
276 real (kind=dp) :: pot, sw, vpair
277 real (kind=dp), dimension(9,nLocal) :: A
278 real (kind=dp), dimension(3,nLocal) :: f
279 real (kind=dp), dimension(3,nLocal) :: t
280 logical, intent(in) :: do_pot
281 real (kind = dp), dimension(3) :: ul1
282 real (kind = dp), dimension(3) :: ul2
283
284 real(kind=dp) :: chi, chiprime, emu, s2
285 real(kind=dp) :: r4, rdotu1, rdotu2, u1dotu2, g, gp, gpi, gmu, gmum
286 real(kind=dp) :: curlyE, enu, enum, eps, dotsum, dotdiff, ds2, dd2
287 real(kind=dp) :: opXdot, omXdot, opXpdot, omXpdot, pref, gfact
288 real(kind=dp) :: BigR, Ri, Ri2, Ri6, Ri7, Ri12, Ri13, R126, R137
289 real(kind=dp) :: dru1dx, dru1dy, dru1dz
290 real(kind=dp) :: dru2dx, dru2dy, dru2dz
291 real(kind=dp) :: dBigRdx, dBigRdy, dBigRdz
292 real(kind=dp) :: dBigRdu1x, dBigRdu1y, dBigRdu1z
293 real(kind=dp) :: dBigRdu2x, dBigRdu2y, dBigRdu2z
294 real(kind=dp) :: dUdx, dUdy, dUdz
295 real(kind=dp) :: dUdu1x, dUdu1y, dUdu1z, dUdu2x, dUdu2y, dUdu2z
296 real(kind=dp) :: dcE, dcEdu1x, dcEdu1y, dcEdu1z, dcEdu2x, dcEdu2y, dcEdu2z
297 real(kind=dp) :: depsdu1x, depsdu1y, depsdu1z, depsdu2x, depsdu2y, depsdu2z
298 real(kind=dp) :: drdx, drdy, drdz
299 real(kind=dp) :: dgdx, dgdy, dgdz
300 real(kind=dp) :: dgdu1x, dgdu1y, dgdu1z, dgdu2x, dgdu2y, dgdu2z
301 real(kind=dp) :: dgpdx, dgpdy, dgpdz
302 real(kind=dp) :: dgpdu1x, dgpdu1y, dgpdu1z, dgpdu2x, dgpdu2y, dgpdu2z
303 real(kind=dp) :: line1a, line1bx, line1by, line1bz
304 real(kind=dp) :: line2a, line2bx, line2by, line2bz
305 real(kind=dp) :: line3a, line3b, line3, line3x, line3y, line3z
306 real(kind=dp) :: term1x, term1y, term1z, term1u1x, term1u1y, term1u1z
307 real(kind=dp) :: term1u2x, term1u2y, term1u2z
308 real(kind=dp) :: term2a, term2b, term2u1x, term2u1y, term2u1z
309 real(kind=dp) :: term2u2x, term2u2y, term2u2z
310 real(kind=dp) :: yick1, yick2, mess1, mess2
311
312 s2 = (gb_l2b_ratio)**2
313 emu = (gb_eps_ratio)**(1.0d0/gb_mu)
314
315 chi = (s2 - 1.0d0)/(s2 + 1.0d0)
316 chiprime = (1.0d0 - emu)/(1.0d0 + emu)
317
318 r4 = r2*r2
319
320 #ifdef IS_MPI
321 ul1(1) = A_Row(3,atom1)
322 ul1(2) = A_Row(6,atom1)
323 ul1(3) = A_Row(9,atom1)
324
325 ul2(1) = A_Col(3,atom2)
326 ul2(2) = A_Col(6,atom2)
327 ul2(3) = A_Col(9,atom2)
328 #else
329 ul1(1) = A(3,atom1)
330 ul1(2) = A(6,atom1)
331 ul1(3) = A(9,atom1)
332
333 ul2(1) = A(3,atom2)
334 ul2(2) = A(6,atom2)
335 ul2(3) = A(9,atom2)
336
337 #endif
338
339 dru1dx = ul1(1)
340 dru2dx = ul2(1)
341 dru1dy = ul1(2)
342 dru2dy = ul2(2)
343 dru1dz = ul1(3)
344 dru2dz = ul2(3)
345
346
347
348 drdx = d(1) / r
349 drdy = d(2) / r
350 drdz = d(3) / r
351
352 ! do some dot products:
353 ! NB the r in these dot products is the actual intermolecular vector,
354 ! and is not the unit vector in that direction.
355
356 rdotu1 = d(1)*ul1(1) + d(2)*ul1(2) + d(3)*ul1(3)
357 rdotu2 = d(1)*ul2(1) + d(2)*ul2(2) + d(3)*ul2(3)
358 u1dotu2 = ul1(1)*ul2(1) + ul1(2)*ul2(2) + ul1(3)*ul2(3)
359
360 ! This stuff is all for the calculation of g(Chi) and dgdx
361 ! Line numbers roughly follow the lines in equation A25 of Luckhurst
362 ! et al. Liquid Crystals 8, 451-464 (1990).
363 ! We note however, that there are some major typos in that Appendix
364 ! of the Luckhurst paper, particularly in equations A23, A29 and A31
365 ! We have attempted to correct them below.
366
367 dotsum = rdotu1+rdotu2
368 dotdiff = rdotu1-rdotu2
369 ds2 = dotsum*dotsum
370 dd2 = dotdiff*dotdiff
371
372 opXdot = 1.0d0 + Chi*u1dotu2
373 omXdot = 1.0d0 - Chi*u1dotu2
374 opXpdot = 1.0d0 + ChiPrime*u1dotu2
375 omXpdot = 1.0d0 - ChiPrime*u1dotu2
376
377 line1a = dotsum/opXdot
378 line1bx = dru1dx + dru2dx
379 line1by = dru1dy + dru2dy
380 line1bz = dru1dz + dru2dz
381
382 line2a = dotdiff/omXdot
383 line2bx = dru1dx - dru2dx
384 line2by = dru1dy - dru2dy
385 line2bz = dru1dz - dru2dz
386
387 term1x = -Chi*(line1a*line1bx + line2a*line2bx)/r2
388 term1y = -Chi*(line1a*line1by + line2a*line2by)/r2
389 term1z = -Chi*(line1a*line1bz + line2a*line2bz)/r2
390
391 line3a = ds2/opXdot
392 line3b = dd2/omXdot
393 line3 = Chi*(line3a + line3b)/r4
394 line3x = d(1)*line3
395 line3y = d(2)*line3
396 line3z = d(3)*line3
397
398 dgdx = term1x + line3x
399 dgdy = term1y + line3y
400 dgdz = term1z + line3z
401
402 term1u1x = 2.0d0*(line1a+line2a)*d(1)
403 term1u1y = 2.0d0*(line1a+line2a)*d(2)
404 term1u1z = 2.0d0*(line1a+line2a)*d(3)
405 term1u2x = 2.0d0*(line1a-line2a)*d(1)
406 term1u2y = 2.0d0*(line1a-line2a)*d(2)
407 term1u2z = 2.0d0*(line1a-line2a)*d(3)
408
409 term2a = -line3a/opXdot
410 term2b = line3b/omXdot
411
412 term2u1x = Chi*ul2(1)*(term2a + term2b)
413 term2u1y = Chi*ul2(2)*(term2a + term2b)
414 term2u1z = Chi*ul2(3)*(term2a + term2b)
415 term2u2x = Chi*ul1(1)*(term2a + term2b)
416 term2u2y = Chi*ul1(2)*(term2a + term2b)
417 term2u2z = Chi*ul1(3)*(term2a + term2b)
418
419 pref = -Chi*0.5d0/r2
420
421 dgdu1x = pref*(term1u1x+term2u1x)
422 dgdu1y = pref*(term1u1y+term2u1y)
423 dgdu1z = pref*(term1u1z+term2u1z)
424 dgdu2x = pref*(term1u2x+term2u2x)
425 dgdu2y = pref*(term1u2y+term2u2y)
426 dgdu2z = pref*(term1u2z+term2u2z)
427
428 g = 1.0d0 - Chi*(line3a + line3b)/(2.0d0*r2)
429
430 BigR = (r - gb_sigma*(g**(-0.5d0)) + gb_sigma)/gb_sigma
431 Ri = 1.0d0/BigR
432 Ri2 = Ri*Ri
433 Ri6 = Ri2*Ri2*Ri2
434 Ri7 = Ri6*Ri
435 Ri12 = Ri6*Ri6
436 Ri13 = Ri6*Ri7
437
438 gfact = (g**(-1.5d0))*0.5d0
439
440 dBigRdx = drdx/gb_sigma + dgdx*gfact
441 dBigRdy = drdy/gb_sigma + dgdy*gfact
442 dBigRdz = drdz/gb_sigma + dgdz*gfact
443
444 dBigRdu1x = dgdu1x*gfact
445 dBigRdu1y = dgdu1y*gfact
446 dBigRdu1z = dgdu1z*gfact
447 dBigRdu2x = dgdu2x*gfact
448 dBigRdu2y = dgdu2y*gfact
449 dBigRdu2z = dgdu2z*gfact
450
451 ! Now, we must do it again for g(ChiPrime) and dgpdx
452
453 line1a = dotsum/opXpdot
454 line2a = dotdiff/omXpdot
455 term1x = -ChiPrime*(line1a*line1bx + line2a*line2bx)/r2
456 term1y = -ChiPrime*(line1a*line1by + line2a*line2by)/r2
457 term1z = -ChiPrime*(line1a*line1bz + line2a*line2bz)/r2
458 line3a = ds2/opXpdot
459 line3b = dd2/omXpdot
460 line3 = ChiPrime*(line3a + line3b)/r4
461 line3x = d(1)*line3
462 line3y = d(2)*line3
463 line3z = d(3)*line3
464
465 dgpdx = term1x + line3x
466 dgpdy = term1y + line3y
467 dgpdz = term1z + line3z
468
469 term1u1x = 2.00d0*(line1a+line2a)*d(1)
470 term1u1y = 2.00d0*(line1a+line2a)*d(2)
471 term1u1z = 2.00d0*(line1a+line2a)*d(3)
472 term1u2x = 2.0d0*(line1a-line2a)*d(1)
473 term1u2y = 2.0d0*(line1a-line2a)*d(2)
474 term1u2z = 2.0d0*(line1a-line2a)*d(3)
475
476 term2a = -line3a/opXpdot
477 term2b = line3b/omXpdot
478
479 term2u1x = ChiPrime*ul2(1)*(term2a + term2b)
480 term2u1y = ChiPrime*ul2(2)*(term2a + term2b)
481 term2u1z = ChiPrime*ul2(3)*(term2a + term2b)
482 term2u2x = ChiPrime*ul1(1)*(term2a + term2b)
483 term2u2y = ChiPrime*ul1(2)*(term2a + term2b)
484 term2u2z = ChiPrime*ul1(3)*(term2a + term2b)
485
486 pref = -ChiPrime*0.5d0/r2
487
488 dgpdu1x = pref*(term1u1x+term2u1x)
489 dgpdu1y = pref*(term1u1y+term2u1y)
490 dgpdu1z = pref*(term1u1z+term2u1z)
491 dgpdu2x = pref*(term1u2x+term2u2x)
492 dgpdu2y = pref*(term1u2y+term2u2y)
493 dgpdu2z = pref*(term1u2z+term2u2z)
494
495 gp = 1.0d0 - ChiPrime*(line3a + line3b)/(2.0d0*r2)
496 gmu = gp**gb_mu
497 gpi = 1.0d0 / gp
498 gmum = gmu*gpi
499
500 curlyE = 1.0d0/dsqrt(1.0d0 - Chi*Chi*u1dotu2*u1dotu2)
501 !!$
502 !!$ dcE = -(curlyE**3)*Chi*Chi*u1dotu2
503 dcE = (curlyE**3)*Chi*Chi*u1dotu2
504
505 dcEdu1x = dcE*ul2(1)
506 dcEdu1y = dcE*ul2(2)
507 dcEdu1z = dcE*ul2(3)
508 dcEdu2x = dcE*ul1(1)
509 dcEdu2y = dcE*ul1(2)
510 dcEdu2z = dcE*ul1(3)
511
512 enu = curlyE**gb_nu
513 enum = enu/curlyE
514
515 eps = gb_eps*enu*gmu
516
517 yick1 = gb_eps*enu*gb_mu*gmum
518 yick2 = gb_eps*gmu*gb_nu*enum
519
520 depsdu1x = yick1*dgpdu1x + yick2*dcEdu1x
521 depsdu1y = yick1*dgpdu1y + yick2*dcEdu1y
522 depsdu1z = yick1*dgpdu1z + yick2*dcEdu1z
523 depsdu2x = yick1*dgpdu2x + yick2*dcEdu2x
524 depsdu2y = yick1*dgpdu2y + yick2*dcEdu2y
525 depsdu2z = yick1*dgpdu2z + yick2*dcEdu2z
526
527 R126 = Ri12 - Ri6
528 R137 = 6.0d0*Ri7 - 12.0d0*Ri13
529
530 mess1 = gmu*R137
531 mess2 = R126*gb_mu*gmum
532
533 dUdx = 4.0d0*gb_eps*enu*(mess1*dBigRdx + mess2*dgpdx)*sw
534 dUdy = 4.0d0*gb_eps*enu*(mess1*dBigRdy + mess2*dgpdy)*sw
535 dUdz = 4.0d0*gb_eps*enu*(mess1*dBigRdz + mess2*dgpdz)*sw
536
537 dUdu1x = 4.0d0*(R126*depsdu1x + eps*R137*dBigRdu1x)*sw
538 dUdu1y = 4.0d0*(R126*depsdu1y + eps*R137*dBigRdu1y)*sw
539 dUdu1z = 4.0d0*(R126*depsdu1z + eps*R137*dBigRdu1z)*sw
540 dUdu2x = 4.0d0*(R126*depsdu2x + eps*R137*dBigRdu2x)*sw
541 dUdu2y = 4.0d0*(R126*depsdu2y + eps*R137*dBigRdu2y)*sw
542 dUdu2z = 4.0d0*(R126*depsdu2z + eps*R137*dBigRdu2z)*sw
543
544 #ifdef IS_MPI
545 f_Row(1,atom1) = f_Row(1,atom1) + dUdx
546 f_Row(2,atom1) = f_Row(2,atom1) + dUdy
547 f_Row(3,atom1) = f_Row(3,atom1) + dUdz
548
549 f_Col(1,atom2) = f_Col(1,atom2) - dUdx
550 f_Col(2,atom2) = f_Col(2,atom2) - dUdy
551 f_Col(3,atom2) = f_Col(3,atom2) - dUdz
552
553 t_Row(1,atom1) = t_Row(1,atom1)- ul1(3)*dUdu1y + ul1(2)*dUdu1z
554 t_Row(2,atom1) = t_Row(2,atom1)- ul1(1)*dUdu1z + ul1(3)*dUdu1x
555 t_Row(3,atom1) = t_Row(3,atom1)- ul1(2)*dUdu1x + ul1(1)*dUdu1y
556
557 t_Col(1,atom2) = t_Col(1,atom2) - ul2(3)*dUdu2y + ul2(2)*dUdu2z
558 t_Col(2,atom2) = t_Col(2,atom2) - ul2(1)*dUdu2z + ul2(3)*dUdu2x
559 t_Col(3,atom2) = t_Col(3,atom2) - ul2(2)*dUdu2x + ul2(1)*dUdu2y
560 #else
561 f(1,atom1) = f(1,atom1) + dUdx
562 f(2,atom1) = f(2,atom1) + dUdy
563 f(3,atom1) = f(3,atom1) + dUdz
564
565 f(1,atom2) = f(1,atom2) - dUdx
566 f(2,atom2) = f(2,atom2) - dUdy
567 f(3,atom2) = f(3,atom2) - dUdz
568
569 t(1,atom1) = t(1,atom1)- ul1(3)*dUdu1y + ul1(2)*dUdu1z
570 t(2,atom1) = t(2,atom1)- ul1(1)*dUdu1z + ul1(3)*dUdu1x
571 t(3,atom1) = t(3,atom1)- ul1(2)*dUdu1x + ul1(1)*dUdu1y
572
573 t(1,atom2) = t(1,atom2)- ul2(3)*dUdu2y + ul2(2)*dUdu2z
574 t(2,atom2) = t(2,atom2)- ul2(1)*dUdu2z + ul2(3)*dUdu2x
575 t(3,atom2) = t(3,atom2)- ul2(2)*dUdu2x + ul2(1)*dUdu2y
576 #endif
577
578 if (do_pot) then
579 #ifdef IS_MPI
580 pot_row(atom1) = pot_row(atom1) + 2.0d0*eps*R126*sw
581 pot_col(atom2) = pot_col(atom2) + 2.0d0*eps*R126*sw
582 #else
583 pot = pot + 4.0*eps*R126*sw
584 #endif
585 endif
586
587 vpair = vpair + 4.0*eps*R126
588 #ifdef IS_MPI
589 id1 = AtomRowToGlobal(atom1)
590 id2 = AtomColToGlobal(atom2)
591 #else
592 id1 = atom1
593 id2 = atom2
594 #endif
595
596 if (molMembershipList(id1) .ne. molMembershipList(id2)) then
597
598 fpair(1) = fpair(1) + dUdx
599 fpair(2) = fpair(2) + dUdy
600 fpair(3) = fpair(3) + dUdz
601
602 endif
603
604 return
605 end subroutine do_gb_pair
606
607 subroutine do_gb_lj_pair(atom1, atom2, d, r, r2, sw, vpair, fpair, &
608 pot, A, f, t, do_pot)
609
610 integer, intent(in) :: atom1, atom2
611 integer :: id1, id2
612 real (kind=dp), intent(inout) :: r, r2
613 real (kind=dp), dimension(3), intent(in) :: d
614 real (kind=dp), dimension(3), intent(inout) :: fpair
615 real (kind=dp) :: pot, sw, vpair
616 real (kind=dp), dimension(9,nLocal) :: A
617 real (kind=dp), dimension(3,nLocal) :: f
618 real (kind=dp), dimension(3,nLocal) :: t
619 logical, intent(in) :: do_pot
620 real (kind = dp), dimension(3) :: ul
621
622 !! real(kind=dp) :: lj2, s_lj2pperp2,s_perpppar2,eabnu, epspar
623 real(kind=dp) :: spar, sperp, slj, par2, perp2, sc, slj2
624 real(kind=dp) :: s_par2mperp2, s_lj2ppar2
625 real(kind=dp) :: enot, eperp, epar, eab, eabf,moom, mum1
626 !! real(kind=dp) :: e_ljpperp, e_perpmpar, e_ljppar
627 real(kind=dp) :: dx, dy, dz, drdx,drdy,drdz, rdotu
628 !! real(kind=dp) :: ct, dctdx, dctdy, dctdz, dctdux, dctduy, dctduz
629 real(kind=dp) :: mess, sab, dsabdct, eprime, deprimedct, depmudct
630 real(kind=dp) :: epmu, depmudx, depmudy, depmudz
631 real(kind=dp) :: depmudux, depmuduy, depmuduz
632 real(kind=dp) :: BigR, dBigRdx, dBigRdy, dBigRdz
633 real(kind=dp) :: dBigRdux, dBigRduy, dBigRduz
634 real(kind=dp) :: dUdx, dUdy, dUdz, dUdux, dUduy, dUduz, e0
635 real(kind=dp) :: Ri, Ri3, Ri6, Ri7, Ril2, Ri13, Rl26, R137, prefactor
636 real(kind=dp) :: chipoalphap2, chioalpha2, ec, epsnot
637 real(kind=dp) :: drdotudx, drdotudy, drdotudz
638 real(kind=dp) :: ljeps, ljsigma, sigmaratio, sigmaratioi
639 integer :: ljt1, ljt2, atid1, atid2
640 logical :: thisProperty
641 #ifdef IS_MPI
642 atid1 = atid_Row(atom1)
643 atid2 = atid_Col(atom2)
644 #else
645 atid1 = atid(atom1)
646 atid2 = atid(atom2)
647 #endif
648 ri =1/r
649
650 dx = d(1)
651 dy = d(2)
652 dz = d(3)
653
654 drdx = dx *ri
655 drdy = dy *ri
656 drdz = dz *ri
657
658
659
660 if(.not.haveGayBerneLJMap) then
661 call createGayBerneLJMap()
662 endif
663 !!$ write(*,*) "in gbljpair"
664 call getElementProperty(atypes, atid1, "is_LennardJones",thisProperty)
665 !!$ write(*,*) thisProperty
666 if(thisProperty.eqv..true.)then
667 #ifdef IS_MPI
668 ul(1) = A_Row(3,atom2)
669 ul(2) = A_Row(6,atom2)
670 ul(3) = A_Row(9,atom2)
671
672 #else
673 ul(1) = A(3,atom2)
674 ul(2) = A(6,atom2)
675 ul(3) = A(9,atom2)
676 #endif
677
678 rdotu = (dx*ul(1)+dy*ul(2)+dz*ul(3))*ri
679
680 ljt1 = LJMap%atidtoLJtype(atid1)
681 ljt2 = LJMap%atidtoLJtype(atid2)
682
683 ljeps = LJMap%LJtype(ljt1)%epsilon
684 !!$ write(*,*) "ljeps"
685 !!$ write(*,*) ljeps
686 drdotudx = ul(1)*ri-rdotu*dx*ri*ri
687 drdotudy = ul(2)*ri-rdotu*dy*ri*ri
688 drdotudz = ul(3)*ri-rdotu*dz*ri*ri
689
690
691 moom = 1.0d0 / gb_mu
692 mum1 = gb_mu-1
693
694 sperp = GayBerneLJMap(ljt1)%sigma_s
695 spar = GayBerneLJMap(ljt1)%sigma_l
696 slj = LJMap%LJtype(ljt1)%sigma
697 slj2 = slj*slj
698 !!$ write(*,*) "spar"
699 !!$ write(*,*) sperp
700 !!$ write(*,*) spar
701 !! chioalpha2 = s_par2mperp2/s_lj2ppar2
702 chioalpha2 =1-((sperp+slj)*(sperp+slj))/((spar+slj)*(spar+slj))
703 sc = (sperp+slj)/2.0d0
704
705 par2 = spar*spar
706 perp2 = sperp*sperp
707 s_par2mperp2 = par2 - perp2
708 s_lj2ppar2 = slj2 + par2
709
710
711 !! check these ! left from old code
712 !! kdaily e0 may need to be (gb_eps + lj_eps)/2
713
714 eperp = dsqrt(gb_eps*ljeps)
715 epar = eperp*gb_eps_ratio
716 enot = dsqrt(ljeps*eperp)
717 chipoalphap2 = 1+(dsqrt(epar*ljeps)/enot)**moom
718 !! to so mess matchs cleaver (eq 20)
719
720 mess = 1-rdotu*rdotu*chioalpha2
721 sab = 1.0d0/dsqrt(mess)
722 dsabdct = sc*sab*sab*sab*rdotu*chioalpha2
723
724 eab = 1-chipoalphap2*rdotu*rdotu
725 eabf = enot*eab**gb_mu
726 depmudct = -2*enot*chipoalphap2*gb_mu*rdotu*eab**mum1
727
728
729 BigR = (r - sab*sc + sc)/sc
730 dBigRdx = (drdx -dsabdct*drdotudx)/sc
731 dBigRdy = (drdy -dsabdct*drdotudy)/sc
732 dBigRdz = (drdz -dsabdct*drdotudz)/sc
733 dBigRdux = (-dsabdct*drdx)/sc
734 dBigRduy = (-dsabdct*drdy)/sc
735 dBigRduz = (-dsabdct*drdz)/sc
736
737 depmudx = depmudct*drdotudx
738 depmudy = depmudct*drdotudy
739 depmudz = depmudct*drdotudz
740 depmudux = depmudct*drdx
741 depmuduy = depmudct*drdy
742 depmuduz = depmudct*drdz
743
744 Ri = 1.0d0/BigR
745 Ri3 = Ri*Ri*Ri
746 Ri6 = Ri3*Ri3
747 Ri7 = Ri6*Ri
748 Ril2 = Ri6*Ri6
749 Ri13 = Ri6*Ri7
750 Rl26 = Ril2 - Ri6
751 R137 = 6.0d0*Ri7 - 12.0d0*Ri13
752
753 prefactor = 4.0d0
754
755 dUdx = prefactor*(eabf*R137*dBigRdx + Rl26*depmudx)
756 dUdy = prefactor*(eabf*R137*dBigRdy + Rl26*depmudy)
757 dUdz = prefactor*(eabf*R137*dBigRdz + Rl26*depmudz)
758 dUdux = prefactor*(eabf*R137*dBigRdux + Rl26*depmudux)
759 dUduy = prefactor*(eabf*R137*dBigRduy + Rl26*depmuduy)
760 dUduz = prefactor*(eabf*R137*dBigRduz + Rl26*depmuduz)
761
762 #ifdef IS_MPI
763 f_Row(1,atom1) = f_Row(1,atom1) - dUdx
764 f_Row(2,atom1) = f_Row(2,atom1) - dUdy
765 f_Row(3,atom1) = f_Row(3,atom1) - dUdz
766
767 f_Col(1,atom2) = f_Col(1,atom2) + dUdx
768 f_Col(2,atom2) = f_Col(2,atom2) + dUdy
769 f_Col(3,atom2) = f_Col(3,atom2) + dUdz
770
771 t_Row(1,atom2) = t_Row(1,atom1) + ul(2)*dUdu1z - ul(3)*dUdu1y
772 t_Row(2,atom2) = t_Row(2,atom1) + ul(3)*dUdu1x - ul(1)*dUdu1z
773 t_Row(3,atom2) = t_Row(3,atom1) + ul(1)*dUdu1y - ul(2)*dUdu1x
774
775 #else
776
777 !!kdaily changed flx(gbatom) to f(1,atom1)
778 f(1,atom1) = f(1,atom1) + dUdx
779 f(2,atom1) = f(2,atom1) + dUdy
780 f(3,atom1) = f(3,atom1) + dUdz
781
782 !!kdaily changed flx(ljatom) to f(2,atom2)
783 f(1,atom2) = f(1,atom2) - dUdx
784 f(2,atom2) = f(2,atom2) - dUdy
785 f(3,atom2) = f(3,atom2) - dUdz
786
787 ! torques are cross products:
788 !!kdaily tlx(gbatom) to t(1, atom1)and ulx(gbatom) to u11(atom1)need mpi
789 t(1,atom2) = t(1,atom2) + ul(2)*dUduz - ul(3)*dUduy
790 t(2,atom2) = t(2,atom2) + ul(3)*dUdux - ul(1)*dUduz
791 t(3,atom2) = t(3,atom2) + ul(1)*dUduy - ul(2)*dUdux
792
793 #endif
794
795 if (do_pot) then
796 #ifdef IS_MPI
797 pot_row(atom1) = pot_row(atom1) + 2.0d0*eps*Rl26*sw
798 pot_col(atom2) = pot_col(atom2) + 2.0d0*eps*Rl26*sw
799 #else
800 pot = pot + prefactor*eabf*Rl26*sw
801 #endif
802 endif
803
804 vpair = vpair + 4.0*epmu*Rl26
805 #ifdef IS_MPI
806 id1 = AtomRowToGlobal(atom1)
807 id2 = AtomColToGlobal(atom2)
808 #else
809 id1 = atom1
810 id2 = atom2
811 #endif
812
813 If (Molmembershiplist(Id1) .Ne. Molmembershiplist(Id2)) Then
814
815 Fpair(1) = Fpair(1) + Dudx
816 Fpair(2) = Fpair(2) + Dudy
817 Fpair(3) = Fpair(3) + Dudz
818
819 Endif
820
821 else
822 !!need to do this all over but switch the gb and lj
823 endif
824 return
825
826 end subroutine do_gb_lj_pair
827
828 subroutine complete_GayBerne_FF(status)
829 integer :: nLJTYPES, nGayBerneTypes, ntypes, current, status, natypes
830 integer, pointer :: MatchList(:) => null ()
831 integer :: i
832 integer :: myATID
833 logical :: thisProperty
834
835 if(.not.associated(LJMap%Ljtype)) then
836
837 natypes = getSize(atypes)
838
839 if(nAtypes == 0) then
840 status = -1
841 return
842 end if
843
844 call getMatchingElementList(atypes, "is_LennardJones", .true., &
845 nLJTypes, MatchList)
846
847 LJMap%nLJtypes = nLJTypes
848
849 if(nLJTypes ==0) then
850 write(*,*)" you broke this thing kyle"
851 return
852 endif
853 allocate(LJMap%LJtype(nLJTypes))
854
855 ntypes = getSize(atypes)
856
857 allocate(LJMap%atidToLJtype(ntypes))
858 end if
859
860 do i =1, ntypes
861
862 myATID = getFirstMatchingElement(atypes, 'c_ident', i)
863 call getElementProperty(atypes, myATID, "is_LennardJones",thisProperty)
864
865 if(thisProperty) then
866 current = LJMap%currentLJtype+1
867 LJMap%currentLJtype = current
868
869 LJMap%atidToLJtype(myATID) = current
870 LJMap%LJtype(current)%atid = myATid
871
872 LJMap%LJtype(current)%sigma = getSigma(myATID)
873 LJMap%LJtype(current)%epsilon = getEpsilon(myATID)
874 endif
875
876 enddo
877 gb_pair_initialized = .true.
878
879 end subroutine complete_GayBerne_FF
880
881 subroutine destroyGayBerneTypes()
882
883 LJMap%Nljtypes =0
884 LJMap%currentLJtype=0
885 if(associated(LJMap%LJtype))then
886 deallocate(LJMap%LJtype)
887 LJMap%LJtype => null()
888 end if
889
890 if(associated(LJMap%atidToLJType))then
891 deallocate(LJMap%atidToLJType)
892 LJMap%atidToLJType => null()
893 end if
894
895 !! deallocate(gayBerneLJMap)
896
897 haveGayBerneLJMap = .false.
898 end subroutine destroyGayBerneTypes
899
900
901
902 end module gb_pair
903