ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/simulation_module.F90
(Generate patch)

Comparing trunk/OOPSE/libmdtools/simulation_module.F90 (file contents):
Revision 378 by mmeineke, Fri Mar 21 17:42:12 2003 UTC vs.
Revision 1183 by gezelter, Fri May 21 15:58:48 2004 UTC

# Line 6 | Line 6 | module simulation
6    use force_globals
7    use vector_class
8    use atype_module
9 <  use lj
9 >  use switcheroo
10   #ifdef IS_MPI
11    use mpiSimulation
12   #endif
# Line 16 | Line 16 | module simulation
16  
17   #define __FORTRAN90
18   #include "fSimulation.h"
19 + #include "fSwitchingFunction.h"
20  
21 <  type (simtype), public :: thisSim
21 >  type (simtype), public, save :: thisSim
22  
23    logical, save :: simulation_setup_complete = .false.
24  
25 <  integer, public, save :: natoms
25 >  integer, public, save :: nLocal, nGlobal
26 >  integer, public, save :: nGroup, nGroupGlobal
27    integer, public, save :: nExcludes_Global = 0
28    integer, public, save :: nExcludes_Local = 0
29    integer, allocatable, dimension(:,:), public :: excludesLocal
30 <  integer, allocatable, dimension(:), public :: excludesGlobal
30 >  integer, allocatable, dimension(:),   public :: excludesGlobal
31 >  integer, allocatable, dimension(:),   public :: molMembershipList
32 >  integer, allocatable, dimension(:),   public :: groupList
33 >  integer, allocatable, dimension(:),   public :: groupStart
34 >  integer, allocatable, dimension(:),   public :: nSkipsForAtom
35 >  integer, allocatable, dimension(:,:), public :: skipsForAtom
36 >  real(kind=dp), allocatable, dimension(:), public :: mfact
37  
38 <  real(kind=dp), save :: rcut2 = 0.0_DP
39 <  real(kind=dp), save :: rcut6 = 0.0_DP
32 <  real(kind=dp), save :: rlist2 = 0.0_DP
33 <  real(kind=dp), public, dimension(3), save :: box
34 <
38 >  real(kind=dp), public, dimension(3,3), save :: Hmat, HmatInv
39 >  logical, public, save :: boxIsOrthorhombic
40    
41    public :: SimulationSetup
42    public :: getNlocal
43    public :: setBox
39  public :: setBox_3d
40  public :: getBox
41  public :: setRcut
42  public :: getRcut
43  public :: getRlist
44  public :: getRrf
45  public :: getRt
44    public :: getDielect
45    public :: SimUsesPBC
46    public :: SimUsesLJ
47 +  public :: SimUsesCharges
48    public :: SimUsesDipoles
49    public :: SimUsesSticky
50    public :: SimUsesRF
# Line 54 | Line 53 | module simulation
53    public :: SimRequiresPrepairCalc
54    public :: SimRequiresPostpairCalc
55    public :: SimUsesDirectionalAtoms
57
58  interface getBox
59     module procedure getBox_3d
60     module procedure getBox_1d
61  end interface
56    
63  interface setBox
64     module procedure setBox_3d
65     module procedure setBox_1d
66  end interface
67  
57   contains
58    
59 <  subroutine SimulationSetup(setThisSim, nComponents, c_idents, &
59 >  subroutine SimulationSetup(setThisSim, CnGlobal, CnLocal, c_idents, &
60         CnLocalExcludes, CexcludesLocal, CnGlobalExcludes, CexcludesGlobal, &
61 +       CmolMembership, Cmfact, CnGroup, CgroupList, CgroupStart, &
62         status)    
63  
64      type (simtype) :: setThisSim
65 <    integer, intent(inout) :: nComponents
66 <    integer, dimension(nComponents),intent(inout) :: c_idents
65 >    integer, intent(inout) :: CnGlobal, CnLocal
66 >    integer, dimension(CnLocal),intent(inout) :: c_idents
67  
68      integer :: CnLocalExcludes
69      integer, dimension(2,CnLocalExcludes), intent(in) :: CexcludesLocal
70      integer :: CnGlobalExcludes
71      integer, dimension(CnGlobalExcludes), intent(in) :: CexcludesGlobal
72 +    integer, dimension(CnGlobal),intent(in) :: CmolMembership
73      !!  Result status, success = 0, status = -1
74      integer, intent(out) :: status
75 <    integer :: i, me, thisStat, alloc_stat, myNode
75 >    integer :: i, j, me, thisStat, alloc_stat, myNode, id1, id2
76 >    integer :: gStart, gEnd, groupSize, biggestGroupSize, ia
77 >
78 >    !! mass factors used for molecular cutoffs
79 >    real ( kind = dp ), dimension(CnLocal) :: Cmfact
80 >    integer, intent(in):: CnGroup
81 >    integer, dimension(CnLocal),intent(in) :: CgroupList
82 >    integer, dimension(CnGroup),intent(in) :: CgroupStart
83 >    integer :: maxSkipsForAtom
84 >
85   #ifdef IS_MPI
86      integer, allocatable, dimension(:) :: c_idents_Row
87      integer, allocatable, dimension(:) :: c_idents_Col
# Line 93 | Line 93 | contains
93      status = 0
94  
95      ! copy C struct into fortran type
96 +
97 +    nLocal = CnLocal
98 +    nGlobal = CnGlobal
99 +    nGroup = CnGroup
100 +
101      thisSim = setThisSim
97    natoms = nComponents
98    rcut2 = thisSim%rcut * thisSim%rcut
99    rcut6 = rcut2 * rcut2 * rcut2
100    rlist2 = thisSim%rlist * thisSim%rlist
101    box = thisSim%box
102  
103      nExcludes_Global = CnGlobalExcludes
104      nExcludes_Local = CnLocalExcludes
105  
106 <    call InitializeForceGlobals(natoms, thisStat)
106 >    call InitializeForceGlobals(nLocal, thisStat)
107      if (thisStat /= 0) then
108 +       write(default_error,*) "SimSetup: InitializeForceGlobals error"
109         status = -1
110         return
111      endif
112  
113      call InitializeSimGlobals(thisStat)
114      if (thisStat /= 0) then
115 +       write(default_error,*) "SimSetup: InitializeSimGlobals error"
116         status = -1
117         return
118      endif
# Line 159 | Line 161 | contains
161         deallocate(c_idents_Row)
162      endif
163      
164 < #else
165 <    do i = 1, nComponents
164 > #endif
165 >
166 > ! We build the local atid's for both mpi and nonmpi
167 >    do i = 1, nLocal
168        
169         me = getFirstMatchingElement(atypes, "c_ident", c_idents(i))
170         atid(i) = me
171    
172      enddo
173 +
174 +    do i = 1, nExcludes_Local
175 +       excludesLocal(1,i) = CexcludesLocal(1,i)
176 +       excludesLocal(2,i) = CexcludesLocal(2,i)
177 +    enddo
178 +
179 +    maxSkipsForAtom = 0
180 +    do j = 1, nLocal
181 +       nSkipsForAtom(j) = 0
182 + #ifdef IS_MPI
183 +       id1 = tagRow(j)
184 + #else
185 +       id1 = j
186   #endif
187 +       do i = 1, nExcludes_Local
188 +          if (excludesLocal(1,i) .eq. id1 ) then
189 +             nSkipsForAtom(j) = nSkipsForAtom(j) + 1
190  
191 <    !! Create neighbor lists
192 <    call expandNeighborList(nComponents, thisStat)
193 <    if (thisStat /= 0) then
194 <       status = -1
191 >             if (nSkipsForAtom(j) .gt. maxSkipsForAtom) then
192 >                maxSkipsForAtom = nSkipsForAtom(j)
193 >             endif
194 >          endif
195 >          if (excludesLocal(2,i) .eq. id1 ) then
196 >             nSkipsForAtom(j) = nSkipsForAtom(j) + 1
197 >
198 >             if (nSkipsForAtom(j) .gt. maxSkipsForAtom) then
199 >                maxSkipsForAtom = nSkipsForAtom(j)
200 >             endif
201 >          endif
202 >       end do
203 >    enddo
204 >
205 >    allocate(skipsForAtom(nLocal, maxSkipsForAtom), stat=alloc_stat)
206 >    if (alloc_stat /= 0 ) then
207 >       write(*,*) 'Could not allocate skipsForAtom array'
208         return
209      endif
210  
211 <    do i = 1, nExcludes_Local
212 <       excludesLocal(1,i) = CexcludesLocal(1,i)
213 <       excludesLocal(2,i) = CexcludesLocal(2,i)
211 >    do j = 1, nLocal
212 >       nSkipsForAtom(j) = 0
213 > #ifdef IS_MPI
214 >       id1 = tagRow(j)
215 > #else
216 >       id1 = j
217 > #endif
218 >       do i = 1, nExcludes_Local
219 >          if (excludesLocal(1,i) .eq. id1 ) then
220 >             nSkipsForAtom(j) = nSkipsForAtom(j) + 1
221 > #ifdef IS_MPI
222 >             id2 = tagColumn(excludesLocal(2,i))
223 > #else
224 >             id2 = excludesLocal(2,i)
225 > #endif
226 >             skipsForAtom(j, nSkipsForAtom(j)) = id2
227 >          endif
228 >          if (excludesLocal(2, i) .eq. id2 ) then
229 >             nSkipsForAtom(j) = nSkipsForAtom(j) + 1
230 > #ifdef IS_MPI
231 >             id2 = tagColumn(excludesLocal(1,i))
232 > #else
233 >             id2 = excludesLocal(1,i)
234 > #endif
235 >             skipsForAtom(j, nSkipsForAtom(j)) = id2
236 >          endif
237 >       end do
238      enddo
239      
240      do i = 1, nExcludes_Global
241         excludesGlobal(i) = CexcludesGlobal(i)
242      enddo
243 +
244 +    do i = 1, nGlobal
245 +       molMemberShipList(i) = CmolMembership(i)
246 +    enddo
247 +    
248 +    biggestGroupSize = 0
249 +    do i = 1, nGroup
250 +       groupStart(i) = CgroupStart(i)
251 +       groupSize = 0
252 +       gStart = groupStart(i)      
253 +       if (i .eq. nGroup) then
254 +          gEnd = nLocal
255 +       else
256 +          gEnd = CgroupStart(i+1) - 1
257 +       endif
258 +       do ia = gStart, gEnd
259 +          groupList(ia) = CgroupList(ia)
260 +          groupSize = groupSize + 1
261 +       enddo
262 +       if (groupSize .gt. biggestGroupSize) biggestGroupSize = groupSize      
263 +    enddo
264 +    groupStart(nGroup+1) = nLocal+1
265 +
266 +    do i = 1, nLocal
267 +       mfact(i) = Cmfact(i)
268 +    enddo    
269      
270      if (status == 0) simulation_setup_complete = .true.
271      
272    end subroutine SimulationSetup
273    
274 <  subroutine setBox_3d(new_box_size)
275 <    real(kind=dp), dimension(3) :: new_box_size
274 >  subroutine setBox(cHmat, cHmatInv, cBoxIsOrthorhombic)
275 >    real(kind=dp), dimension(3,3) :: cHmat, cHmatInv
276 >    integer :: cBoxIsOrthorhombic
277      integer :: smallest, status, i
278 <
279 <    thisSim%box = new_box_size
280 <    box = thisSim%box
281 <
282 <    smallest = 1
283 <    do i = 2, 3
284 <       if (new_box_size(i) .lt. new_box_size(smallest)) smallest = i
201 <    end do
202 <    if (thisSim%rcut .gt. 0.5_dp * new_box_size(smallest)) &
203 <         call setRcut(0.5_dp * new_box_size(smallest), status)
204 <    return    
205 <  end subroutine setBox_3d
206 <
207 <  subroutine setBox_1d(dim, new_box_size)
208 <    integer :: dim, status
209 <    real(kind=dp) :: new_box_size
210 <    thisSim%box(dim) = new_box_size
211 <    box(dim) = thisSim%box(dim)
212 <    if (thisSim%rcut .gt. 0.5_dp * new_box_size) &
213 <         call setRcut(0.5_dp * new_box_size, status)
214 <  end subroutine setBox_1d
215 <
216 <  subroutine setRcut(new_rcut, status)
217 <    real(kind = dp) :: new_rcut
218 <    integer :: myStatus, status
219 <    thisSim%rcut = new_rcut
220 <    rcut2 = thisSim%rcut * thisSim%rcut
221 <    rcut6 = rcut2 * rcut2 * rcut2
222 <    myStatus = 0
223 <    call LJ_new_rcut(new_rcut, myStatus)
224 <    if (myStatus .ne. 0) then
225 <       write(default_error, *) 'LJ module refused our rcut!'
226 <       status = -1
227 <       return
278 >    
279 >    Hmat = cHmat
280 >    HmatInv = cHmatInv
281 >    if (cBoxIsOrthorhombic .eq. 0 ) then
282 >       boxIsOrthorhombic = .false.
283 >    else
284 >       boxIsOrthorhombic = .true.
285      endif
229    status = 0
230    return
231  end subroutine setRcut
232
233  function getBox_3d() result(thisBox)
234    real( kind = dp ), dimension(3) :: thisBox
235    thisBox = thisSim%box
236  end function getBox_3d
237  
238  function getBox_1d(dim) result(thisBox)
239    integer, intent(in) :: dim
240    real( kind = dp ) :: thisBox
286      
287 <    thisBox = thisSim%box(dim)
288 <  end function getBox_1d
244 <    
245 <  subroutine getRcut(thisrcut,rc2,rc6,status)
246 <    real( kind = dp ), intent(out) :: thisrcut
247 <    real( kind = dp ), intent(out), optional :: rc2
248 <    real( kind = dp ), intent(out), optional :: rc6
249 <    integer, optional :: status
287 >    return    
288 >  end subroutine setBox
289  
251    if (present(status)) status = 0
252    
253    if (.not.simulation_setup_complete ) then
254       if (present(status)) status = -1
255       return
256    end if
257    
258    thisrcut = thisSim%rcut
259    if(present(rc2)) rc2 = rcut2
260    if(present(rc6)) rc6 = rcut6
261  end subroutine getRcut
262  
263  subroutine getRlist(thisrlist,rl2,status)
264    real( kind = dp ), intent(out) :: thisrlist
265    real( kind = dp ), intent(out), optional :: rl2
266
267    integer, optional :: status
268
269    if (present(status)) status = 0
270
271    if (.not.simulation_setup_complete ) then
272       if (present(status)) status = -1
273       return
274    end if
275    
276    thisrlist = thisSim%rlist
277    if(present(rl2)) rl2 = rlist2
278  end subroutine getRlist
279
280  function getRrf() result(rrf)
281    real( kind = dp ) :: rrf
282    rrf = thisSim%rrf
283  end function getRrf
284  
285  function getRt() result(rt)
286    real( kind = dp ) :: rt
287    rt = thisSim%rt
288  end function getRt
289
290    function getDielect() result(dielect)
291      real( kind = dp ) :: dielect
292      dielect = thisSim%dielect
# Line 307 | Line 307 | contains
307      doesit = thisSim%SIM_uses_sticky
308    end function SimUsesSticky
309  
310 +  function SimUsesCharges() result(doesit)
311 +    logical :: doesit
312 +    doesit = thisSim%SIM_uses_charges
313 +  end function SimUsesCharges
314 +
315    function SimUsesDipoles() result(doesit)
316      logical :: doesit
317      doesit = thisSim%SIM_uses_dipoles
# Line 350 | Line 355 | contains
355      thisStat = 0
356      
357      call FreeSimGlobals()    
358 +
359 +    allocate(nSkipsForAtom(nLocal), stat=alloc_stat)
360 +    if (alloc_stat /= 0 ) then
361 +       thisStat = -1
362 +       return
363 +    endif
364      
365      allocate(excludesLocal(2,nExcludes_Local), stat=alloc_stat)
366      if (alloc_stat /= 0 ) then
# Line 362 | Line 373 | contains
373         thisStat = -1
374         return
375      endif
376 +
377 +    allocate(molMembershipList(nGlobal), stat=alloc_stat)
378 +    if (alloc_stat /= 0 ) then
379 +       thisStat = -1
380 +       return
381 +    endif
382 +
383 +    allocate(groupStart(nGroup+1), stat=alloc_stat)
384 +    if (alloc_stat /= 0 ) then
385 +       thisStat = -1
386 +       return
387 +    endif
388 +
389 +    allocate(groupList(nLocal), stat=alloc_stat)
390 +    if (alloc_stat /= 0 ) then
391 +       thisStat = -1
392 +       return
393 +    endif
394 +
395 +    allocate(mfact(nLocal), stat=alloc_stat)
396 +    if (alloc_stat /= 0 ) then
397 +       thisStat = -1
398 +       return
399 +    endif
400      
401    end subroutine InitializeSimGlobals
402    
403    subroutine FreeSimGlobals()
404      
405      !We free in the opposite order in which we allocate in.
406 <    
406 >
407 >    if (allocated(skipsForAtom)) deallocate(skipsForAtom)
408 >    if (allocated(mfact)) deallocate(mfact)
409 >    if (allocated(groupList)) deallocate(groupList)    
410 >    if (allocated(groupStart)) deallocate(groupStart)    
411 >    if (allocated(molMembershipList)) deallocate(molMembershipList)    
412      if (allocated(excludesGlobal)) deallocate(excludesGlobal)
413      if (allocated(excludesLocal)) deallocate(excludesLocal)
414 <
414 >    
415    end subroutine FreeSimGlobals
416 <
417 <  pure function getNlocal() result(nlocal)
418 <    integer :: nlocal
419 <    nlocal = natoms
416 >  
417 >  pure function getNlocal() result(n)
418 >    integer :: n
419 >    n = nLocal
420    end function getNlocal
381
421    
422 +  
423   end module simulation

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines