ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/md_code/lj_FF.F90
(Generate patch)

Comparing trunk/mdtools/md_code/lj_FF.F90 (file contents):
Revision 246 by chuckv, Fri Jan 24 21:36:52 2003 UTC vs.
Revision 258 by chuckv, Thu Jan 30 22:29:37 2003 UTC

# Line 2 | Line 2
2   !! Corresponds to the force field defined in lj_FF.cpp
3   !! @author Charles F. Vardeman II
4   !! @author Matthew Meineke
5 < !! @version $Id: lj_FF.F90,v 1.10 2003-01-24 21:36:52 chuckv Exp $, $Date: 2003-01-24 21:36:52 $, $Name: not supported by cvs2svn $, $Revision: 1.10 $
5 > !! @version $Id: lj_FF.F90,v 1.15 2003-01-30 22:29:37 chuckv Exp $, $Date: 2003-01-30 22:29:37 $, $Name: not supported by cvs2svn $, $Revision: 1.15 $
6  
7  
8  
9   module lj_ff
10    use simulation
11    use definitions
12 +  use generic_atypes
13   #ifdef IS_MPI
14    use mpiSimulation
15   #endif
# Line 18 | Line 19 | module lj_ff
19   !! Number of lj_atypes in lj_atype_list
20    integer, save :: n_lj_atypes = 0
21  
22 < !! Starting Size for ljMixed Array
23 <  integer, parameter :: ljMixed_blocksize = 10
22 > !! Global list of lj atypes in simulation
23 >  type (lj_atype), pointer :: ljListHead => null()
24 >  type (lj_atype), pointer :: ljListTail => null()
25  
24 !! Basic atom type for a Lennard-Jones Atom.
25  type, public :: lj_atype
26     private
27     sequence
28 !! Unique number for place in linked list
29     integer :: atype_number = 0
30 !! Unique indentifier number (ie atomic no, etc)
31     integer :: atype_ident = 0
32 !! Mass of Particle
33     real ( kind = dp )  :: mass = 0.0_dp
34 !! Lennard-Jones epslon
35     real ( kind = dp )  :: epsilon = 0.0_dp
36 !! Lennard-Jones Sigma
37     real ( kind = dp )  :: sigma = 0.0_dp
38 !! Lennard-Jones Sigma Squared
39     real ( kind = dp )  :: sigma2 = 0.0_dp
40 !! Lennard-Jones Sigma to sixth
41     real ( kind = dp )  :: sigma6 = 0.0_dp
42 !! Pointer for linked list creation
43     type (lj_atype), pointer :: next => null()
44  end type lj_atype
26  
46 !! Pointer type for atype ident array
47  type, public :: lj_atypePtr
48     type (lj_atype), pointer :: this => null()
49  end type lj_atypePtr
50
51 !! Global list of lj atypes in simulation
52  type (lj_atype), pointer :: lj_atype_list => null()
27   !! LJ mixing array  
28    type (lj_atype), dimension(:,:), pointer :: ljMixed => null()
55 !! identity pointer list for force loop.
56  type (lj_atypePtr), dimension(:), pointer :: identPtrList => null()
29  
30  
31   !! Neighbor list and commom arrays
# Line 64 | Line 36 | module lj_ff
36    integer :: nListAllocs = 0
37    integer, parameter :: maxListAllocs = 5
38  
39 < #ifdef IS_MPI
68 < ! Universal routines: All types of force calculations will need these arrays
69 < ! Arrays specific to a type of force calculation should be declared in that module.
70 < !! Row position array.
71 <  real( kind = dp ), allocatable, dimension(:,:) :: qRow
72 < !! Column position array.
73 <  real( kind = dp ), allocatable, dimension(:,:) :: qColumn
39 >  logical, save :: firstTime = .True.
40  
41 < !! Row Force array.
42 <  real( kind = dp ), allocatable, dimension(:,:) :: fRow
77 < !! Column Force Array.
78 <  real( kind = dp ), allocatable, dimension(:,:) :: fColumn
79 <
80 < !! Row potential energy array
81 <  real( kind = dp ), allocatable, dimension(:) :: eRow
82 < !! Column potential energy array
83 <  real( kind = dp ), allocatable, dimension(:) :: eColumn
84 <
85 <
41 > !! Atype identity pointer lists
42 > #ifdef IS_MPI
43   !! Row lj_atype pointer list
44 <  type (lj_atypePtr), dimension(:), pointer :: identPtrListRow => null()
44 >  type (lj_identPtrList), dimension(:), pointer :: identPtrListRow => null()
45   !! Column lj_atype pointer list
46 <  type (lj_atypePtr), dimension(:), pointer :: identPtrListColumn => null()
46 >  type (lj_identPtrList), dimension(:), pointer :: identPtrListColumn => null()
47 > #else
48 >  type( lj_identPtrList ), dimension(:), pointer :: identPtrList => null()
49   #endif
50  
51  
# Line 105 | Line 64 | contains
64  
65   contains
66  
67 + !! Adds a new lj_atype to the list.
68    subroutine new_lj_atype(ident,mass,epsilon,sigma,status)
69      real( kind = dp ), intent(in) :: mass
70      real( kind = dp ), intent(in) :: epsilon
# Line 112 | Line 72 | contains
72      integer, intent(in) :: ident
73      integer, intent(out) :: status
74  
75 <    type (lj_atype), pointer :: this_lj_atype
116 <    type (lj_atype), pointer :: lj_atype_ptr
117 <
118 <    type (lj_atype), dimension(:,:), pointer :: thisMix
119 <    type (lj_atype), dimension(:,:), pointer :: oldMix
75 >    type (lj_atype), pointer :: newLJ_atype
76      integer :: alloc_error
77      integer :: atype_counter = 0
78      integer :: alloc_size
79 <
79 >    integer :: err_stat
80      status = 0
81  
82  
83  
84   ! allocate a new atype    
85 <    allocate(this_lj_atype,stat=alloc_error)
85 >    allocate(newLJ_atype,stat=alloc_error)
86      if (alloc_error /= 0 ) then
87         status = -1
88         return
89      end if
90  
91   ! assign our new lj_atype information
92 <    this_lj_atype%mass        = mass
93 <    this_lj_atype%epsilon     = epsilon
94 <    this_lj_atype%sigma       = sigma
95 <    this_lj_atype%sigma2      = sigma * sigma
96 <    this_lj_atype%sigma6      = this_lj_atype%sigma2 * this_lj_atype%sigma2 &
97 <         * this_lj_atype%sigma2
92 >    newLJ_atype%mass        = mass
93 >    newLJ_atype%epsilon     = epsilon
94 >    newLJ_atype%sigma       = sigma
95 >    newLJ_atype%sigma2      = sigma * sigma
96 >    newLJ_atype%sigma6      = newLJ_atype%sigma2 * newLJ_atype%sigma2 &
97 >         * newLJ_atype%sigma2
98   ! assume that this atype will be successfully added
99 <    this_lj_atype%atype_ident = ident
100 <    this_lj_atype%atype_number = n_lj_atypes + 1
99 >    newLJ_atype%atype_ident = ident
100 >    newLJ_atype%atype_number = n_lj_atypes + 1
101  
102 <
103 < ! First time through allocate a array of size ljMixed_blocksize
104 <    if(.not. associated(ljMixed)) then
105 <       allocate(thisMix(ljMixed_blocksize,ljMixed_blocksize))
150 <       if (alloc_error /= 0 ) then
151 <          status = -1
152 <          return
153 <       end if
154 <       ljMixed => thisMix
155 < ! If we have outgrown ljMixed_blocksize, allocate a new matrix twice the size and
156 < ! point ljMix at the new matrix.
157 <    else if( (n_lj_atypes + 1) > size(ljMixed)) then
158 <       alloc_size = 2*size(ljMixed)
159 <       allocate(thisMix(alloc_size,alloc_size))
160 <       if (alloc_error /= 0 ) then
161 <          status = -1
162 <          return
163 <       end if
164 < ! point oldMix at old ljMixed array
165 <       oldMix => ljMixed
166 < ! Copy oldMix into new Mixed array      
167 <       thisMix = oldMix
168 < ! Point ljMixed at new array
169 <       ljMixed => thisMix
170 < ! Free old array so we don't have a memory leak
171 <       deallocate(oldMix)
102 >    call add_atype(newLJ_atype,ljListHead,ljListTail,err_stat)
103 >    if (err_stat /= 0 ) then
104 >       status = -1
105 >       return
106      endif
107  
174
175
176
177
178 ! Find bottom of atype master list
179 ! if lj_atype_list is null then we are at the top of the list.
180    if (.not. associated(lj_atype_list)) then
181
182       write(*,*) "Associating lists for first time"
183      
184
185       this_lj_atype%atype_number = 1
186      
187       ljMixed(n_lj_atypes,n_lj_atypes)%sigma  = this_lj_atype%sigma
188      
189       ljMixed(n_lj_atypes,n_lj_atypes)%sigma2  = ljMixed(n_lj_atypes,n_lj_atypes)%sigma &
190            * ljMixed(n_lj_atypes,n_lj_atypes)%sigma
191      
192       ljMixed(n_lj_atypes,n_lj_atypes)%sigma6 = ljMixed(n_lj_atypes,n_lj_atypes)%sigma2 &
193            * ljMixed(n_lj_atypes,n_lj_atypes)%sigma2 &
194            * ljMixed(n_lj_atypes,n_lj_atypes)%sigma2
195      
196       ljMixed(n_lj_atypes,n_lj_atypes)%epsilon = this_lj_atype%epsilon
197      
198       lj_atype_list => this_lj_atype
199      
200       write(*,*) "lj_atype_list first time through -- ident", lj_atype_list%atype_ident
201    else ! we need to find the bottom of the list to insert new atype
202       write(*,*) "Second time through"
203       lj_atype_ptr => lj_atype_list
204       write(*,*) "lj_atype_ptr to next"
205       atype_counter = 1
206       find_end: do
207          if (.not. associated(lj_atype_ptr)) exit find_end
208
209          write(*,*) "Inside find_end-this ident", lj_atype_ptr%atype_ident
210 ! Set up mixing for new atype and current atype in list
211       ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma  =  &
212            calcLJMix("sigma",this_lj_atype%sigma, &
213            lj_atype_ptr%sigma)
214
215       ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma2  = &
216            ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma &
217            * ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma
218
219       ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma6 = &
220            ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma2 &
221            * ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma2 &
222            * ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%sigma2
223
224       ljMixed(this_lj_atype%atype_number,lj_atype_ptr%atype_number)%epsilon = &
225            calcLJMix("epsilon",this_lj_atype%epsilon, &
226            lj_atype_ptr%epsilon)
227
228 ! Advance to next pointer
229       lj_atype_ptr => lj_atype_ptr%next          
230       atype_counter = atype_counter + 1          
231       end do find_end
232
233       lj_atype_ptr => this_lj_atype
234       write(*,*) "just added: ", lj_atype_ptr%atype_ident
235    end if
236
237    write(*,*) "lj_atype_list now contains.."
238    
239    lj_atype_ptr => lj_atype_list
240    do while (associated(lj_atype_ptr))
241       write(*,*) "lj_atype_list contains ident", lj_atype_ptr%atype_ident
242       lj_atype_ptr => lj_atype_ptr%next
243    end do
244    
245 ! Insert new atype at end of list
246
247 ! Increment number of atypes
248
108      n_lj_atypes = n_lj_atypes + 1
109  
251 ! Set up self mixing
110  
111    end subroutine new_lj_atype
112  
# Line 271 | Line 129 | contains
129      integer, allocatable, dimension(:) :: identCol
130      integer :: nrow
131      integer :: ncol
274    integer :: alloc_stat
132   #endif
133      status = 0
134 +  
135  
136 <    write(*,*) "Initializing ljFF"
136 >    
137 >
138   !! if were're not in MPI, we just update ljatypePtrList
139   #ifndef IS_MPI
140 <    call new_ljatypePtrList(nComponents,ident,identPtrList,thisStat)
140 >    call create_IdentPtrlst(ident,ljListHead,identPtrList,thisStat)
141      if ( thisStat /= 0 ) then
142         status = -1
143         return
144      endif
145 <    write(*,*) "component pointer list initialized"
145 >
146   !! Allocate pointer lists
147      allocate(point(nComponents),stat=alloc_stat)
148      if (alloc_stat /=0) then
# Line 299 | Line 158 | contains
158      
159   ! if were're in MPI, we also have to worry about row and col lists    
160   #else
161 +  
162   ! We can only set up forces if mpiSimulation has been setup.
163      if (.not. isMPISimSet()) then
164 +       write(default_error,*) "MPI is not set"
165         status = -1
166         return
167      endif
168 <    nrow = getNrow()
169 <    ncol = getNcol()
168 >    nrow = getNrow(plan_row)
169 >    ncol = getNcol(plan_col)
170 >
171   !! Allocate temperary arrays to hold gather information
172      allocate(identRow(nrow),stat=alloc_stat)
173      if (alloc_stat /= 0 ) then
# Line 318 | Line 180 | contains
180         status = -1
181         return
182      endif
183 +
184   !! Gather idents into row and column idents
185 +
186      call gather(ident,identRow,plan_row)
187      call gather(ident,identCol,plan_col)
188 <
188 >    
189 >
190   !! Create row and col pointer lists
191 <    call new_ljatypePtrList(nrow,identRow,identPtrListRow,thisStat)
191 >
192 >    call create_IdentPtrlst(identRow,ljListHead,identPtrListRow,thisStat)
193      if (thisStat /= 0 ) then
194         status = -1
195         return
196      endif
197  
198 <    call new_ljatypePtrList(ncol,identCol,identPtrListCol,thisStat)
198 >    call create_IdentPtrlst(identCol,ljListHead,identPtrListColumn,thisStat)
199      if (thisStat /= 0 ) then
200         status = -1
201         return
202      endif
203 <
203 >    write(*,*) "After createIdent row-col lists"
204   !! free temporary ident arrays
205 <    deallocate(identCol)
206 <    deallocate(identRow)
207 <
208 < !! Allocate Simulation arrays
209 < !! NOTE: This bit of code should be fixed, it can cause large
344 < !! memory fragmentation if call repeatedly
345 <
346 <    if (.not.allocated(qRow)) then
347 <       allocate(qRow(3,nrow),stat=alloc_stat)
348 <       if (alloc_stat /= 0 ) then
349 <          status = -1
350 <          return
351 <       endif
352 <    else
353 <       deallocate(qrow)
354 <       allocate(qRow(3,nrow),stat=alloc_stat)
355 <       if (alloc_stat /= 0 ) then
356 <          status = -1
357 <          return
358 <       endif
359 <    endif
360 <
361 <    if (.not.allocated(3,qCol)) then
362 <       allocate(qCol(ncol),stat=alloc_stat)
363 <       if (alloc_stat /= 0 ) then
364 <          status = -1
365 <          return
366 <       endif
367 <    else
368 <       deallocate(qCol)
369 <       allocate(qCol(3,ncol),stat=alloc_stat)
370 <       if (alloc_stat /= 0 ) then
371 <          status = -1
372 <          return
373 <       endif
374 <    endif
375 <
376 <    if (.not.allocated(fRow)) then
377 <       allocate(fRow(3,nrow),stat=alloc_stat)
378 <       if (alloc_stat /= 0 ) then
379 <          status = -1
380 <          return
381 <       endif
382 <    else
383 <       deallocate(fRow)
384 <       allocate(fRow(3,nrow),stat=alloc_stat)
385 <       if (alloc_stat /= 0 ) then
386 <          status = -1
387 <          return
388 <       endif
389 <    endif
390 <
391 <    if (.not.allocated(fCol)) then
392 <       allocate(fCol(3,ncol),stat=alloc_stat)
393 <       if (alloc_stat /= 0 ) then
394 <          status = -1
395 <          return
396 <       endif
397 <    else
398 <       deallocate(fCol)
399 <       allocate(fCol(3,ncol),stat=alloc_stat)
400 <       if (alloc_stat /= 0 ) then
401 <          status = -1
402 <          return
403 <       endif
404 <    endif
405 <
406 <    if (.not.allocated(eRow)) then
407 <       allocate(eRow(nrow),stat=alloc_stat)
408 <       if (alloc_stat /= 0 ) then
409 <          status = -1
410 <          return
411 <       endif
412 <    else
413 <       deallocate(eRow)
414 <       allocate(eRow(nrow),stat=alloc_stat)
415 <       if (alloc_stat /= 0 ) then
416 <          status = -1
417 <          return
418 <       endif
205 >    if (allocated(identCol)) then
206 >       deallocate(identCol)
207 >    end if
208 >    if (allocated(identCol)) then
209 >       deallocate(identRow)
210      endif
211  
421    if (.not.allocated(eCol)) then
422       allocate(eCol(ncol),stat=alloc_stat)
423       if (alloc_stat /= 0 ) then
424          status = -1
425          return
426       endif
427    else
428       deallocate(eCol)
429       allocate(eCol(ncol),stat=alloc_stat)
430       if (alloc_stat /= 0 ) then
431          status = -1
432          return
433       endif
434    endif
435
436    if (.not.allocated(eTemp)) then
437       allocate(eTemp(nComponents),stat=alloc_stat)
438       if (alloc_stat /= 0 ) then
439          status = -1
440          return
441       endif
442    else
443       deallocate(eTemp)
444       allocate(eTemp(nComponets),stat=alloc_stat)
445       if (alloc_stat /= 0 ) then
446          status = -1
447          return
448       endif
449    endif
450
451
212   !! Allocate neighbor lists for mpi simulations.
213      if (.not. allocated(point)) then
214         allocate(point(nrow),stat=alloc_stat)
# Line 480 | Line 240 | contains
240  
241   #endif
242      
243 <    
244 <    do i = 1, nComponents
245 <       write(*,*) "Ident pointer list ident: ", identPtrList(i)%this%atype_ident
246 <    end do
247 <
243 >    call createMixingList(thisStat)
244 >    if (thisStat /= 0) then
245 >       status = -1
246 >       return
247 >    endif
248      isljFFinit = .true.
249  
250    end subroutine init_ljFF
# Line 493 | Line 253 | contains
253  
254  
255  
496 !! Takes an ident array and creates an atype pointer list
497 !! based on those identities
498  subroutine new_ljatypePtrList(mysize,ident,PtrList,status)
499    integer, intent(in) :: mysize
500    integer,dimension(:), intent(in) :: ident
501    integer, optional :: status
502    type(lj_atypePtr), dimension(:), pointer :: PtrList
256  
257 <    integer :: thisIdent
257 >  subroutine createMixingList(status)
258 >    integer :: listSize
259 >    integer :: status
260      integer :: i
261 <    integer :: alloc_error
507 <    type (lj_atype), pointer :: tmpPtr
261 >    integer :: j
262  
263 <    if (present(status)) status = 0
263 >    integer :: outerCounter = 0
264 >    integer :: innerCounter = 0
265 >    type (lj_atype), pointer :: tmpPtrOuter => null()
266 >    type (lj_atype), pointer :: tmpPtrInner => null()
267 >    status = 0
268  
269 <    write(*,*) "Creating new ljatypePtrList...."
270 < ! First time through, allocate list
271 <    if (.not.associated(PtrList)) then
272 <       write(*,*) "allocating pointer list...."
273 <       allocate(PtrList(mysize))
269 >    listSize = getListLen(ljListHead)
270 >    if (listSize == 0) then
271 >       status = -1
272 >       return
273 >    end if
274 >  
275 >
276 >    if (.not. associated(ljMixed)) then
277 >       allocate(ljMixed(listSize,listSize))
278      else
279 < ! We want to creat a new ident list so free old list
280 <       deallocate(PtrList)
281 <       allocate(PtrList(mysize))
520 <    endif
279 >       status = -1
280 >       return
281 >    end if
282  
283 < ! Match pointer list
284 <    write(*,*) "Doing ident search"
285 <    do i = 1, mysize
286 <       thisIdent = ident(i)
287 <       write(*,*) "Calling getLJatype for ident ", thisIdent
288 <       call getLJatype(thisIdent,tmpPtr)
289 <
290 <      if (.not. associated(tmpPtr)) then
291 <         write(*,*) "tmpptr was not associated"
292 <          status = -1
293 <          return
283 >    
284 >
285 >    tmpPtrOuter => ljListHead
286 >    tmpPtrInner => tmpPtrOuter%next
287 >    do while (associated(tmpPtrOuter))
288 >       outerCounter = outerCounter + 1
289 > ! do self mixing rule
290 >       ljMixed(outerCounter,outerCounter)%sigma  = tmpPtrOuter%sigma
291 >                                                                                                  
292 >       ljMixed(outerCounter,outerCounter)%sigma2  = ljMixed(outerCounter,outerCounter)%sigma &
293 >            * ljMixed(outerCounter,outerCounter)%sigma
294 >                                                                                                  
295 >       ljMixed(outerCounter,outerCounter)%sigma6 = ljMixed(outerCounter,outerCounter)%sigma2 &
296 >            * ljMixed(outerCounter,outerCounter)%sigma2 &
297 >            * ljMixed(outerCounter,outerCounter)%sigma2
298 >                                                                                                  
299 >       ljMixed(outerCounter,outerCounter)%epsilon = tmpPtrOuter%epsilon
300 >
301 >       innerCounter = outerCounter + 1
302 >       do while (associated(tmpPtrInner))
303 >          
304 >          ljMixed(outerCounter,innerCounter)%sigma  =  &
305 >               calcLJMix("sigma",tmpPtrOuter%sigma, &
306 >               tmpPtrInner%sigma)
307 >          
308 >          ljMixed(outerCounter,innerCounter)%sigma2  = &
309 >               ljMixed(outerCounter,innerCounter)%sigma &
310 >               * ljMixed(outerCounter,innerCounter)%sigma
311 >          
312 >          ljMixed(outerCounter,innerCounter)%sigma6 = &
313 >               ljMixed(outerCounter,innerCounter)%sigma2 &
314 >               * ljMixed(outerCounter,innerCounter)%sigma2 &
315 >               * ljMixed(outerCounter,innerCounter)%sigma2
316 >          
317 >          ljMixed(outerCounter,innerCounter)%epsilon = &
318 >               calcLJMix("epsilon",tmpPtrOuter%epsilon, &
319 >               tmpPtrInner%epsilon)
320 >          ljMixed(innerCounter,outerCounter)%sigma = ljMixed(outerCounter,innerCounter)%sigma
321 >          ljMixed(innerCounter,outerCounter)%sigma2 = ljMixed(outerCounter,innerCounter)%sigma2
322 >          ljMixed(innerCounter,outerCounter)%sigma6 = ljMixed(outerCounter,innerCounter)%sigma6
323 >          ljMixed(innerCounter,outerCounter)%epsilon = ljMixed(outerCounter,innerCounter)%epsilon
324 >
325 >
326 >          tmpPtrInner => tmpPtrInner%next
327 >          innerCounter = innerCounter + 1
328 >       end do
329 > ! advance pointers
330 >       tmpPtrOuter => tmpPtrOuter%next
331 >       if (associated(tmpPtrOuter)) then
332 >          tmpPtrInner => tmpPtrOuter%next
333         endif
334        
535       PtrList(i)%this => tmpPtr
335      end do
336  
337 <  end subroutine new_ljatypePtrList
337 >  end subroutine createMixingList
338  
540 !! Finds a lj_atype based upon numerical ident
541 !! returns a null pointer if error
542  subroutine getLJatype(ident,ljAtypePtr)
543    integer, intent(in) :: ident
544    type (lj_atype), pointer :: ljAtypePtr    
545    type (lj_atype), pointer :: tmplj_atype_ptr => null()
339  
547    write(*,*) "Finding ljAtype for ident ", ident
548    ljAtypePtr => null()
340  
550    if(.not. associated(lj_atype_list)) return
341  
552 ! Point at head of list.
553    write(*,*) "Searching at head of list"
554    tmplj_atype_ptr => lj_atype_list
555    find_ident: do
556       if (.not.associated(tmplj_atype_ptr)) then
557          write(*,*) "Find_ident, pointer not associated"
558          exit find_ident
559       else if( tmplj_atype_ptr%atype_ident == ident) then
560          ljAtypePtr => tmplj_atype_ptr
561          exit find_ident
562       endif
563       tmplj_atype_ptr => tmplj_atype_ptr%next
564    end do find_ident
342  
343  
344  
345  
569  end subroutine getLJatype
570
571
346   !! FORCE routine Calculates Lennard Jones forces.
347   !------------------------------------------------------------->
348    subroutine do_lj_ff(q,f,potE,do_pot)
# Line 582 | Line 356 | contains
356      type(lj_atype), pointer :: ljAtype_i
357      type(lj_atype), pointer :: ljAtype_j
358  
359 < #ifdef MPI
360 <  real( kind = DP ), dimension(3,getNcol()) :: efr
359 > #ifdef IS_MPI
360 >  real( kind = DP ), dimension(3,getNcol(plan_col)) :: efr
361    real( kind = DP ) :: pot_local
362   #else
363    real( kind = DP ), dimension(3,getNlocal()) :: efr
364   #endif
365    
366 + !! Local arrays needed for MPI
367 + #ifdef IS_MPI
368 +  real(kind = dp), dimension(3,getNrow(plan_row)) :: qRow
369 +  real(kind = dp), dimension(3,getNcol(plan_col)) :: qCol
370 +
371 +  real(kind = dp), dimension(3,getNrow(plan_row)) :: fRow
372 +  real(kind = dp), dimension(3,getNcol(plan_col)) :: fCol
373 +  real(kind = dp), dimension(3,getNlocal()) :: fMPITemp
374 +
375 +  real(kind = dp), dimension(getNrow(plan_row)) :: eRow
376 +  real(kind = dp), dimension(getNcol(plan_col)) :: eCol
377 +
378 +  real(kind = dp), dimension(getNlocal()) :: eTemp
379 + #endif
380 +
381 +
382 +
383    real( kind = DP )   :: pe
384    logical             :: update_nlist
385  
# Line 611 | Line 402 | contains
402    integer :: ncol
403    integer :: natoms
404  
405 +
406 +
407 +
408   ! Make sure we are properly initialized.
409    if (.not. isljFFInit) then
410       write(default_error,*) "ERROR: lj_FF has not been properly initialized"
# Line 627 | Line 421 | contains
421    natoms = getNlocal()
422    call getRcut(rcut,rcut2=rcutsq)
423    call getRlist(rlist,rlistsq)
424 +
425   #ifndef IS_MPI
426    nrow = natoms - 1
427    ncol = natoms
# Line 640 | Line 435 | contains
435    
436   !! See if we need to update neighbor lists
437    call check(q,update_nlist)
438 +  if (firstTime) then
439 +     update_nlist = .true.
440 +     firstTime = .false.
441 +  endif
442  
443   !--------------WARNING...........................
444   ! Zero variables, NOTE:::: Forces are zeroed in C
# Line 651 | Line 450 | contains
450    pe = 0.0E0_DP
451  
452   #else
453 <    f_row = 0.0E0_DP
454 <    f_col = 0.0E0_DP
453 >    fRow = 0.0E0_DP
454 >    fCol = 0.0E0_DP
455  
456      pe_local = 0.0E0_DP
457  
# Line 663 | Line 462 | contains
462      efr = 0.0E0_DP
463  
464   ! communicate MPI positions
465 < #ifdef MPI    
466 <    call gather(q,qRow,plan_row3)
467 <    call gather(q,qCol,plan_col3)
465 > #ifdef IS_MPI    
466 >    call gather(q,qRow,plan_row3d)
467 >    call gather(q,qCol,plan_col3d)
468   #endif
469  
470  
# Line 677 | Line 476 | contains
476      
477       nlist = 0
478      
479 <    
479 >    
480  
481       do i = 1, nrow
482          point(i) = nlist + 1
483 < #ifdef MPI
483 > #ifdef IS_MPI
484          ljAtype_i => identPtrListRow(i)%this
485          tag_i = tagRow(i)
486          rxi = qRow(1,i)
# Line 696 | Line 495 | contains
495   #endif
496  
497          inner: do j = j_start, ncol
498 < #ifdef MPI
498 > #ifdef IS_MPI
499   ! Assign identity pointers and tags
500             ljAtype_j => identPtrListColumn(j)%this
501 <           tag_j = tagCol(j)
501 >           tag_j = tagColumn(j)
502             if (newtons_thrd) then
503                if (tag_i <= tag_j) then
504                   if (mod(tag_i + tag_j,2) == 0) cycle inner
# Line 720 | Line 519 | contains
519   #endif          
520             rijsq = rxij*rxij + ryij*ryij + rzij*rzij
521  
522 < #ifdef MPI
522 > #ifdef IS_MPI
523               if (rijsq <=  rlistsq .AND. &
524                    tag_j /= tag_i) then
525   #else
526 +          
527               if (rijsq <  rlistsq) then
528   #endif
529              
# Line 734 | Line 534 | contains
534                endif
535                list(nlist) = j
536  
537 <              
537 >    
538                if (rijsq <  rcutsq) then
539                  
540                   r = dsqrt(rijsq)
541        
542                   call getLJPot(r,pot,dudr,ljAtype_i,ljAtype_j)
543        
544 < #ifdef MPI
544 > #ifdef IS_MPI
545                  eRow(i) = eRow(i) + pot*0.5
546                  eCol(i) = eCol(i) + pot*0.5
547   #else
548 <                pe = pe + pot
548 >                    pe = pe + pot
549   #endif                
550              
551                   efr(1,j) = -rxij
# Line 759 | Line 559 | contains
559                      ftmp = dudr * drdx1
560  
561  
562 < #ifdef MPI
562 > #ifdef IS_MPI
563                      fCol(dim,j) = fCol(dim,j) - ftmp
564                      fRow(dim,i) = fRow(dim,i) + ftmp
565   #else                    
# Line 774 | Line 574 | contains
574          enddo inner
575       enddo
576  
577 < #ifdef MPI
577 > #ifdef IS_MPI
578       point(nrow + 1) = nlist + 1
579   #else
580       point(natoms) = nlist + 1
# Line 788 | Line 588 | contains
588          JEND = POINT(i+1) - 1
589          ! check thiat molecule i has neighbors
590          if (jbeg .le. jend) then
591 < #ifdef MPI
591 > #ifdef IS_MPI
592             ljAtype_i => identPtrListRow(i)%this
593             rxi = qRow(1,i)
594             ryi = qRow(2,i)
# Line 801 | Line 601 | contains
601   #endif
602             do jnab = jbeg, jend
603                j = list(jnab)
604 < #ifdef MPI
604 > #ifdef IS_MPI
605                ljAtype_j = identPtrListColumn(j)%this
606 <              rxij = wrap(rxi - q_col(1,j), 1)
607 <              ryij = wrap(ryi - q_col(2,j), 2)
608 <              rzij = wrap(rzi - q_col(3,j), 3)
606 >              rxij = wrap(rxi - qCol(1,j), 1)
607 >              ryij = wrap(ryi - qCol(2,j), 2)
608 >              rzij = wrap(rzi - qCol(3,j), 3)
609   #else
610                ljAtype_j = identPtrList(j)%this
611                rxij = wrap(rxi - q(1,j), 1)
# Line 819 | Line 619 | contains
619                   r = dsqrt(rijsq)
620                  
621                   call getLJPot(r,pot,dudr,ljAtype_i,ljAtype_j)
622 < #ifdef MPI
622 > #ifdef IS_MPI
623                  eRow(i) = eRow(i) + pot*0.5
624                  eCol(i) = eCol(i) + pot*0.5
625   #else
# Line 835 | Line 635 | contains
635                      
636                      drdx1 = efr(dim,j) / r
637                      ftmp = dudr * drdx1
638 < #ifdef MPI
638 > #ifdef IS_MPI
639                      fCol(dim,j) = fCol(dim,j) - ftmp
640                      fRow(dim,i) = fRow(dim,i) + ftmp
641   #else                    
# Line 851 | Line 651 | contains
651  
652  
653  
654 < #ifdef MPI
654 > #ifdef IS_MPI
655      !!distribute forces
656 <    call scatter(fRow,f,plan_row3)
656 >    call scatter(fRow,f,plan_row3d)
657  
658 <    call scatter(fCol,f_tmp,plan_col3)
658 >    call scatter(fCol,fMPITemp,plan_col3d)
659  
660      do i = 1,nlocal
661 <       f(1:3,i) = f(1:3,i) + f_tmp(1:3,i)
661 >       f(1:3,i) = f(1:3,i) + fMPITemp(1:3,i)
662      end do
663  
664  
665      
666      if (do_pot) then
667   ! scatter/gather pot_row into the members of my column
668 <       call scatter(e_row,e_tmp,plan_row)
668 >       call scatter(eRow,eTemp,plan_row)
669        
670         ! scatter/gather pot_local into all other procs
671         ! add resultant to get total pot
672         do i = 1, nlocal
673 <          pe_local = pe_local + e_tmp(i)
673 >          pe_local = pe_local + eTemp(i)
674         enddo
675         if (newtons_thrd) then
676 <          e_tmp = 0.0E0_DP
677 <          call scatter(e_col,e_tmp,plan_col)
676 >          eTemp = 0.0E0_DP
677 >          call scatter(eCol,eTemp,plan_col)
678            do i = 1, nlocal
679 <             pe_local = pe_local + e_tmp(i)
679 >             pe_local = pe_local + eTemp(i)
680            enddo
681         endif
682      endif
# Line 885 | Line 685 | contains
685  
686      potE = pe
687  
688 +  
689  
690 +
691    end subroutine do_lj_ff
692  
693   !! Calculates the potential between two lj particles based on two lj_atype pointers, optionally returns second
# Line 941 | Line 743 | contains
743      epsilon  = ljMixed(atype1%atype_ident,atype2%atype_ident)%epsilon
744  
745  
746 <
746 >    
747 >
748      call getRcut(rcut,rcut2=rcut2,rcut6=rcut6,status=errorStat)
749      
750      r2 = r * r

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines