ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/simulation_module.F90
Revision: 1144
Committed: Sat May 1 18:52:38 2004 UTC (20 years, 2 months ago) by tim
File size: 7882 byte(s)
Log Message:
C++ pass groupList to fortran

File Contents

# User Rev Content
1 mmeineke 377 !! Fortran interface to C entry plug.
2    
3     module simulation
4     use definitions
5     use neighborLists
6     use force_globals
7     use vector_class
8     use atype_module
9     #ifdef IS_MPI
10     use mpiSimulation
11     #endif
12    
13     implicit none
14     PRIVATE
15    
16     #define __FORTRAN90
17     #include "fSimulation.h"
18    
19 gezelter 747 type (simtype), public, save :: thisSim
20 mmeineke 377
21     logical, save :: simulation_setup_complete = .false.
22    
23 mmeineke 491 integer, public, save :: nLocal, nGlobal
24 mmeineke 377 integer, public, save :: nExcludes_Global = 0
25     integer, public, save :: nExcludes_Local = 0
26     integer, allocatable, dimension(:,:), public :: excludesLocal
27     integer, allocatable, dimension(:), public :: excludesGlobal
28 chuckv 482 integer, allocatable, dimension(:), public :: molMembershipList
29 mmeineke 377
30 mmeineke 569 real(kind=dp), public, dimension(3,3), save :: Hmat, HmatInv
31 gezelter 570 logical, public, save :: boxIsOrthorhombic
32 mmeineke 377
33     public :: SimulationSetup
34     public :: getNlocal
35     public :: setBox
36     public :: getDielect
37     public :: SimUsesPBC
38     public :: SimUsesLJ
39 gezelter 941 public :: SimUsesCharges
40 mmeineke 377 public :: SimUsesDipoles
41     public :: SimUsesSticky
42     public :: SimUsesRF
43     public :: SimUsesGB
44     public :: SimUsesEAM
45     public :: SimRequiresPrepairCalc
46     public :: SimRequiresPostpairCalc
47     public :: SimUsesDirectionalAtoms
48    
49     contains
50    
51 mmeineke 491 subroutine SimulationSetup(setThisSim, CnGlobal, CnLocal, c_idents, &
52 gezelter 483 CnLocalExcludes, CexcludesLocal, CnGlobalExcludes, CexcludesGlobal, &
53 tim 1144 CmolMembership, mfact, ngroup, groupList, groupStart, &
54 mmeineke 377 status)
55    
56     type (simtype) :: setThisSim
57 mmeineke 491 integer, intent(inout) :: CnGlobal, CnLocal
58     integer, dimension(CnLocal),intent(inout) :: c_idents
59 mmeineke 377
60     integer :: CnLocalExcludes
61     integer, dimension(2,CnLocalExcludes), intent(in) :: CexcludesLocal
62     integer :: CnGlobalExcludes
63     integer, dimension(CnGlobalExcludes), intent(in) :: CexcludesGlobal
64 mmeineke 491 integer, dimension(CnGlobal),intent(in) :: CmolMembership
65 mmeineke 377 !! Result status, success = 0, status = -1
66     integer, intent(out) :: status
67     integer :: i, me, thisStat, alloc_stat, myNode
68 tim 1144
69     !! mass factors used for molecular cutoffs
70     real ( kind = dp ), dimension(3,nLocal) :: mfact
71     integer, intent(in):: ngroup
72     integer, dimension(nLocal),intent(in) :: groupList
73     integer, dimension(ngroup),intent(in) :: groupStart
74    
75 mmeineke 377 #ifdef IS_MPI
76     integer, allocatable, dimension(:) :: c_idents_Row
77     integer, allocatable, dimension(:) :: c_idents_Col
78     integer :: nrow
79     integer :: ncol
80     #endif
81    
82     simulation_setup_complete = .false.
83     status = 0
84    
85     ! copy C struct into fortran type
86 mmeineke 491
87     nLocal = CnLocal
88     nGlobal = CnGlobal
89    
90 mmeineke 377 thisSim = setThisSim
91 mmeineke 620
92 mmeineke 377 nExcludes_Global = CnGlobalExcludes
93     nExcludes_Local = CnLocalExcludes
94    
95 mmeineke 491 call InitializeForceGlobals(nLocal, thisStat)
96 mmeineke 377 if (thisStat /= 0) then
97 chuckv 480 write(default_error,*) "SimSetup: InitializeForceGlobals error"
98 mmeineke 377 status = -1
99     return
100     endif
101    
102     call InitializeSimGlobals(thisStat)
103     if (thisStat /= 0) then
104 chuckv 480 write(default_error,*) "SimSetup: InitializeSimGlobals error"
105 mmeineke 377 status = -1
106     return
107     endif
108    
109     #ifdef IS_MPI
110     ! We can only set up forces if mpiSimulation has been setup.
111     if (.not. isMPISimSet()) then
112     write(default_error,*) "MPI is not set"
113     status = -1
114     return
115     endif
116     nrow = getNrow(plan_row)
117     ncol = getNcol(plan_col)
118     mynode = getMyNode()
119    
120     allocate(c_idents_Row(nrow),stat=alloc_stat)
121     if (alloc_stat /= 0 ) then
122     status = -1
123     return
124     endif
125    
126     allocate(c_idents_Col(ncol),stat=alloc_stat)
127     if (alloc_stat /= 0 ) then
128     status = -1
129     return
130     endif
131    
132     call gather(c_idents, c_idents_Row, plan_row)
133     call gather(c_idents, c_idents_Col, plan_col)
134    
135     do i = 1, nrow
136     me = getFirstMatchingElement(atypes, "c_ident", c_idents_Row(i))
137     atid_Row(i) = me
138     enddo
139    
140     do i = 1, ncol
141     me = getFirstMatchingElement(atypes, "c_ident", c_idents_Col(i))
142     atid_Col(i) = me
143     enddo
144    
145     !! free temporary ident arrays
146     if (allocated(c_idents_Col)) then
147     deallocate(c_idents_Col)
148     end if
149     if (allocated(c_idents_Row)) then
150     deallocate(c_idents_Row)
151     endif
152    
153 chuckv 648 #endif
154    
155     ! We build the local atid's for both mpi and nonmpi
156 gezelter 490 do i = 1, nLocal
157 mmeineke 377
158     me = getFirstMatchingElement(atypes, "c_ident", c_idents(i))
159     atid(i) = me
160    
161     enddo
162    
163    
164 chuckv 388
165 chuckv 648
166 mmeineke 377 do i = 1, nExcludes_Local
167     excludesLocal(1,i) = CexcludesLocal(1,i)
168     excludesLocal(2,i) = CexcludesLocal(2,i)
169     enddo
170    
171     do i = 1, nExcludes_Global
172     excludesGlobal(i) = CexcludesGlobal(i)
173     enddo
174 mmeineke 435
175 gezelter 490 do i = 1, nGlobal
176 gezelter 483 molMemberShipList(i) = CmolMembership(i)
177 mmeineke 491 enddo
178 chuckv 482
179 mmeineke 377 if (status == 0) simulation_setup_complete = .true.
180    
181     end subroutine SimulationSetup
182    
183 mmeineke 569 subroutine setBox(cHmat, cHmatInv, cBoxIsOrthorhombic)
184 gezelter 570 real(kind=dp), dimension(3,3) :: cHmat, cHmatInv
185 mmeineke 569 integer :: cBoxIsOrthorhombic
186 mmeineke 377 integer :: smallest, status, i
187 gezelter 570
188 mmeineke 569 Hmat = cHmat
189     HmatInv = cHmatInv
190 gezelter 570 if (cBoxIsOrthorhombic .eq. 0 ) then
191 mmeineke 569 boxIsOrthorhombic = .false.
192 gezelter 570 else
193     boxIsOrthorhombic = .true.
194 mmeineke 569 endif
195    
196 mmeineke 377 return
197 mmeineke 569 end subroutine setBox
198 mmeineke 377
199     function getDielect() result(dielect)
200     real( kind = dp ) :: dielect
201     dielect = thisSim%dielect
202     end function getDielect
203    
204     function SimUsesPBC() result(doesit)
205     logical :: doesit
206     doesit = thisSim%SIM_uses_PBC
207     end function SimUsesPBC
208    
209     function SimUsesLJ() result(doesit)
210     logical :: doesit
211     doesit = thisSim%SIM_uses_LJ
212     end function SimUsesLJ
213    
214     function SimUsesSticky() result(doesit)
215     logical :: doesit
216     doesit = thisSim%SIM_uses_sticky
217     end function SimUsesSticky
218    
219 gezelter 941 function SimUsesCharges() result(doesit)
220     logical :: doesit
221     doesit = thisSim%SIM_uses_charges
222     end function SimUsesCharges
223    
224 mmeineke 377 function SimUsesDipoles() result(doesit)
225     logical :: doesit
226     doesit = thisSim%SIM_uses_dipoles
227     end function SimUsesDipoles
228    
229     function SimUsesRF() result(doesit)
230     logical :: doesit
231     doesit = thisSim%SIM_uses_RF
232     end function SimUsesRF
233    
234     function SimUsesGB() result(doesit)
235     logical :: doesit
236     doesit = thisSim%SIM_uses_GB
237     end function SimUsesGB
238    
239     function SimUsesEAM() result(doesit)
240     logical :: doesit
241     doesit = thisSim%SIM_uses_EAM
242     end function SimUsesEAM
243    
244     function SimUsesDirectionalAtoms() result(doesit)
245     logical :: doesit
246     doesit = thisSim%SIM_uses_dipoles .or. thisSim%SIM_uses_sticky .or. &
247     thisSim%SIM_uses_GB .or. thisSim%SIM_uses_RF
248     end function SimUsesDirectionalAtoms
249    
250     function SimRequiresPrepairCalc() result(doesit)
251     logical :: doesit
252     doesit = thisSim%SIM_uses_EAM
253     end function SimRequiresPrepairCalc
254    
255     function SimRequiresPostpairCalc() result(doesit)
256     logical :: doesit
257     doesit = thisSim%SIM_uses_RF
258     end function SimRequiresPostpairCalc
259    
260     subroutine InitializeSimGlobals(thisStat)
261     integer, intent(out) :: thisStat
262     integer :: alloc_stat
263    
264     thisStat = 0
265    
266     call FreeSimGlobals()
267    
268     allocate(excludesLocal(2,nExcludes_Local), stat=alloc_stat)
269     if (alloc_stat /= 0 ) then
270     thisStat = -1
271     return
272     endif
273    
274     allocate(excludesGlobal(nExcludes_Global), stat=alloc_stat)
275     if (alloc_stat /= 0 ) then
276     thisStat = -1
277     return
278     endif
279 chuckv 482
280 mmeineke 491 allocate(molMembershipList(nGlobal), stat=alloc_stat)
281 chuckv 482 if (alloc_stat /= 0 ) then
282     thisStat = -1
283     return
284     endif
285 mmeineke 377
286     end subroutine InitializeSimGlobals
287    
288     subroutine FreeSimGlobals()
289    
290     !We free in the opposite order in which we allocate in.
291 gezelter 483
292     if (allocated(molMembershipList)) deallocate(molMembershipList)
293 mmeineke 377 if (allocated(excludesGlobal)) deallocate(excludesGlobal)
294     if (allocated(excludesLocal)) deallocate(excludesLocal)
295 gezelter 483
296 mmeineke 377 end subroutine FreeSimGlobals
297    
298 mmeineke 491 pure function getNlocal() result(n)
299     integer :: n
300     n = nLocal
301 mmeineke 377 end function getNlocal
302    
303    
304     end module simulation