source: mklist.f@ cb47b9c

Last change on this file since cb47b9c was cb47b9c, checked in by baerbaer <baerbaer@…>, 14 years ago

Explicitly declare variables.

All variables should be declared so that we can remove the implicit statements
from the beginning of the INCL.H file.

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/smmp/trunk@25 26dc1dd8-5c4e-0410-9ffe-d298b4865968

  • Property mode set to 100644
File size: 11.8 KB
Line 
1! **************************************************************
2!
3! This file contains the subroutines: mklist,quench
4!
5! Copyright 2003-2005 Frank Eisenmenger, U.H.E. Hansmann,
6! Shura Hayryan, Chin-Ku
7! Copyright 2007 Frank Eisenmenger, U.H.E. Hansmann,
8! Jan H. Meinke, Sandipan Mohanty
9!
10! **************************************************************
11
12 subroutine mklist(nml)
13
14! ......................................................................
15! PURPOSE: Compile interaction lists ('1-4' according to Scheraga)
16!
17! CALLS: quench
18! ......................................................................
19! TODO: Calculate van-der-Waals regions over all molecules.
20 include 'INCL.H'
21 integer nml
22
23 integer mxh, mx2, l1st1, l1st2, l2nd1, l2nd2, l1i, l2i
24 parameter (mxh=50, ! max. # of atom regions
25 & mx2=50)
26
27 logical ovlp,quench
28
29 dimension l1st1(mxh),l1st2(mxh),l2nd1(mxh),l2nd2(mxh)
30 & ,l1i(mxbd),l2i(mx2)
31
32 integer ia, i, i1s, i2s, ibd, ib, ifivr, ifiat, ilaat, im, ilavr,
33 & iob, io, ioiob, iow, it, is, iv, jbd, j, n1i, n14, n1st,
34 & n2nd, n2i, ntlms, nvw
35
36! _______________________ indices of 1st vdw-region/14-partner for 'nml'
37 if (nml.eq.1) then
38 ivwml1(1)=1
39 i14ml1(1)=1
40 else
41 ivwml1(nml)=ivwml1(nml-1)+nvwml(nml-1)
42 i14ml1(nml)=i14ml1(nml-1)+n14ml(nml-1)
43 endif
44
45 ntlms=nmsml(nml)
46 if (ntlms.eq.0) then
47 write (*,'(a,i4)')
48 & ' mklist> No mov. sets defined in molecule #',nml
49 nvwml(nml)=0
50 n14ml(nml)=0
51 return
52 endif
53
54 nvw=ivwml1(nml)-1 ! # of vdw-regions we have so far
55 n14=i14ml1(nml)-1 ! # of 14-partners -"-
56! First atom in molecule
57 ifiat=iatrs1(irsml1(nml))
58! Last atom in molecule
59 ilaat=iatrs2(irsml2(nml))
60! First variable in molecule
61 ifivr=ivrml1(nml)
62! Last variable in molecule
63 ilavr=ifivr+nvrml(nml)-1
64! ____________________________ initialize: 1st vdw-region & 14-partner per atom
65 do i=ifiat,ilaat
66 ivwat1(i)=0 !!! for some atoms ...
67 i14at1(i)=0 !!! ... remains = 0
68 enddo
69 n1st=1 ! initialize 1ST list of interact. partners:
70 l1st1(1)=ifiat ! one region including ALL atoms
71 l1st2(1)=ilaat ! of molecule 'nml'
72
73 i1s=imsml1(nml)+ntlms ! 1st mov.set of molecule 'nml+1'
74
75 do io=ilavr,ifivr,-1 ! ====== from last -> first variable in 'nml'
76 iv=iorvr(io) ! ====== according to 'descendent' order
77 it=ityvr(iv) ! type of var.
78 i2s=i1s-1
79 i1s=imsvr1(iv)
80 if ((i2s-i1s+1).gt.0) then
81
82! ____________ exclude mov.sets of var. 'iv' from 1ST list of interact.partn.
83 do is=i1s,i2s
84 ovlp=quench(latms1(is),latms2(is),n1st,mxh,l1st1,l1st2)
85 enddo
86! _______________________________ intitialize 2ND list with current 1ST list
87 do i=1,n1st
88 l2nd1(i)=l1st1(i)
89 l2nd2(i)=l1st2(i)
90 enddo
91 n2nd=n1st
92! _________________________________ exclude 'ib' of var. 'iv' from 2ND list
93 ib=iowat(iatvr(iv))
94 ovlp=quench(ib,ib,n2nd,mxh,l2nd1,l2nd2)
95
96 ovlp=.false.
97 iob=iowat(ib)
98 n2i=0
99 if (iob.gt.0) then ! 'iob' exists
100 ovlp=quench(iob,iob,n2nd,mxh,l2nd1,l2nd2) ! & in 2ND list
101
102! _____ atoms branching from 'iob': into GENERAL list of 1-4 partners
103 do i=1,nbdat(iob)
104 ibd=ibdat(i,iob)
105 if (ibd.ne.ib.and.iowat(ibd).eq.iob.and.
106 & quench(ibd,ibd,n2nd,mxh,l2nd1,l2nd2) ) then
107 n2i=n2i+1
108 if (n2i.gt.mx2) then
109 write (*,'(a,i3,2a)') ' mklist> Molecule # ',nml,
110 & ': too many atoms bound to ',nmat(iob)
111 stop
112 endif
113 l2i(n2i)=ibd
114 endif
115 enddo ! ... branches of 'iob'
116! ____________________________ check for further '1-4' partners
117! connected to branches 'l2i'
118 do i=1,n2i
119 ia=l2i(i)
120 im=ixmsat(ia)
121 if (im.gt.0) then
122 do j=latms1(im),latms2(im)
123 if (ia.ne.j.and.
124 & quench(j,j,n2nd,mxh,l2nd1,l2nd2) ) then
125 n2i=n2i+1
126 if (n2i.gt.mx2) then
127 write (*,'(a,i3,a)') ' mklist> Molecule # '
128 & ,nml,': too many atoms in list L2I'
129 stop
130 endif
131 l2i(n2i)=j
132 endif
133 enddo
134 endif
135 enddo
136
137! ____ If 'iow(iob)' exists and in 2ND list: into GENERAL list of 1-4 partners
138 ioiob=iowat(iob) ! existence of iow( iow(base) )
139 if (ioiob.gt.0) then
140 if( quench(ioiob,ioiob,n2nd,mxh,l2nd1,l2nd2) ) then
141 n2i=n2i+1
142 if (n2i.gt.mx2) then
143 write (*,'(a,i3,2a)') ' mklist> Molecule # '
144 & ,nml,': too many atoms bound to ',nmat(iob)
145 stop
146 endif
147 l2i(n2i)=ioiob
148 endif
149 else
150 ioiob=-10
151 endif
152
153 else
154 iob=-10
155 ioiob=-10
156 endif
157
158! ______ Atoms bound to 'ib' & in 2ND list(=are NOT in m.s of 'iv'):
159! exclude from 2ND list & put in list 'l1i'
160 n1i=0
161 do i=1,nbdat(ib)
162 ibd=ibdat(i,ib)
163 if (iowat(ibd).eq.ib.and.
164 & quench(ibd,ibd,n2nd,mxh,l2nd1,l2nd2) ) then
165 n1i=n1i+1
166 if (n1i.gt.mxbd) then
167 write (*,'(a,i3,2a)') ' mklist> Molecule # ',nml,
168 & ': too many atoms bound to ',nmat(ib)
169 stop
170 endif
171 l1i(n1i)=ibd
172! _______ add atoms branching from 'l1i'-atoms to GENERAL list 1-4 partners
173 do j=1,nbdat(ibd)
174 jbd=ibdat(j,ibd)
175 if (iowat(jbd).eq.ibd.and.
176 & quench(jbd,jbd,n2nd,mxh,l2nd1,l2nd2) ) then
177 n2i=n2i+1
178 if (n2i.gt.mx2) then
179 write (*,'(a,i3,2a)') ' mklist> Molecule # ',nml,
180 & ': too many atoms bound to branches of ',nmat(ib)
181 stop
182 endif
183 l2i(n2i)=jbd
184 endif
185 enddo
186 endif
187 enddo
188! _____________________________ check for further '1-4' partners
189! belonging to moving set of base 'ib'
190 im=ixmsat(ib)
191 if (im.gt.0) then
192 do i=latms1(im),latms2(im)
193 if (quench(i,i,n2nd,mxh,l2nd1,l2nd2) ) then
194 n2i=n2i+1
195 if (n2i.gt.mx2) then
196 write (*,'(a,i3,a)') ' mklist> Molecule # ',nml,
197 & ': too many atoms n list L2I '
198 stop
199 endif
200 l2i(n2i)=i
201 endif
202 enddo
203 endif
204
205 do is=i1s,i2s
206 do i=latms1(is),latms2(is) ! ============= atoms in m.s of 'iv'
207! ________________________________________ Current 2ND list -> VdW-interact.
208 if ((nvw+n2nd).gt.mxvw) then
209 write (*,'(a,i4,a,i5)') ' mklist> Molecule # ',nml,
210 & ': Number of vdw-domains > ',mxvw
211 stop
212 endif
213 ivwat1(i)=nvw+1 ! first and last vdW-domain ..
214 ivwat2(i)=nvw+n2nd ! .. per atom
215 do j=1,n2nd
216 nvw=nvw+1
217 ixatvw(nvw)=i
218 lvwat1(nvw)=l2nd1(j)
219 lvwat2(nvw)=l2nd2(j)
220 enddo ! ... vdW-domains
221! _________________________________________ General list of 1-4 partners
222 if ((n14+n2i).gt.mx14) goto 1
223 i14at1(i)=n14+1
224 do j=1,n2i
225 n14=n14+1
226 ixat14(n14)=i
227 l14at(n14)=l2i(j)
228 enddo
229! __________________________________ Special cases of 1-4 interactions
230! (list l1i, atoms iob,ib)
231 iow=iowat(i)
232 if (iow.ne.ib) then
233 if ((n14+n1i).gt.mx14) goto 1
234 do j=1,n1i ! _____ branches of 'ib' NOT in m.s
235 n14=n14+1
236 ixat14(n14)=i
237 l14at(n14)=l1i(j)
238 enddo
239 if (ovlp.and.(it.eq.1.or.it.eq.2)) then ! _____ iob:
240 n14=n14+1 ! b.lengths/angles
241 if (n14.gt.mx14) goto 1
242 ixat14(n14)=i
243 l14at(n14)=iob
244 endif
245 if (iowat(iow).ne.ib.and.it.eq.1) then ! ___ ib:
246 n14=n14+1 ! b.length
247 if (n14.gt.mx14) goto 1
248 ixat14(n14)=i
249 l14at(n14)=ib
250 endif
251 endif ! ... spec. case
252 i14at2(i)=n14
253 enddo ! ... atoms for moving set 'is'
254 enddo ! ... m.s for var. 'iv'
255
256 endif ! if there are moving sets
257 enddo ! ... variables
258
259 nvwml(nml)=nvw-ivwml1(nml)+1
260 n14ml(nml)=n14-i14ml1(nml)+1
261! _________________________________ some cleaning up
262 do i=ifiat,ilaat
263 if (ivwat1(i).le.0) then
264 ivwat1(i)=1
265 ivwat2(i)=0
266 endif
267 if (i14at1(i).le.0) then
268 i14at1(i)=1
269 i14at2(i)=0
270 endif
271 enddo
272
273! ____________________________________________ Summary
274! do i=ifiat,ilaat
275! write (*,'(3a,i5,a)') ' ######## atom ',nmat(i),'(',i,')'
276! iv1=ivwat1(i)
277! iv2=ivwat2(i)
278! if (iv1.le.iv2) then
279! write(*,'(a)') ' ---> vdW :'
280! do j=iv1,iv2
281! write (*,'(i5,a,i5)') lvwat1(j),'-',lvwat2(j)
282! enddo
283! endif
284! i41=i14at1(i)
285! i42=i14at2(i)
286! if (i41.le.i42) then
287! write(*,'(a)') ' ---> 1-4 :'
288! write(*,'(10i5)') (l14at(j),j=i41,i42)
289! endif
290! enddo
291
292 return
293
294 1 write (*,'(a,i4,a,i5)') ' mklist> Molecule # ',nml,
295 & ': Number of 1-4 interactions > ',mx14
296 stop
297 end
298! *********************************************
299 logical function quench(i1,i2,n,mx,l1,l2)
300
301! ....................................................
302! PURPOSE: Correct size/number (n) of index ranges
303! given by lists 'l1' & 'l2' in order to
304! EXCLUDE overlaps with range 'i1-i2'
305!
306! quench = true, if any overlap was obtained
307!
308! CALLS: none
309!
310! ....................................................
311
312 implicit integer*4 (i-n)
313
314 dimension l1(mx),l2(mx)
315
316 quench=.false. ! initialize
317
318 j=1
319 do while (j.le.n) ! while there are sets
320 j1=l1(j)
321 j2=l2(j)
322
323 if (i1.le.j2.and.i2.ge.j1) then ! Overlap
324 quench=.true.
325
326 ja=0
327 if (i1.gt.j1) then
328 ja=1
329 l2(j)=i1-1
330 endif
331 if (i2.lt.j2) then
332 if (ja.gt.0) then ! +1 set
333 n=n+1
334 if (n.gt.mx) then
335 write (*,'(a)') ' quench> too many sets'
336 stop
337 endif
338 do k=n,j+2,-1 ! shift sets
339 l1(k)=l1(k-1)
340 l2(k)=l2(k-1)
341 enddo
342 l2(j+1)=j2
343 endif
344 l1(j+ja)=i2+1
345 ja=ja+1
346 endif
347
348 if (ja.eq.0) then ! -1 set
349 n=n-1
350 do k=j,n
351 l1(k)=l1(k+1)
352 l2(k)=l2(k+1)
353 enddo
354 else
355 j=j+ja
356 endif
357
358 else ! No overlap
359 j=j+1
360 endif
361
362 enddo ! ... sets
363
364 return
365 end
366
Note: See TracBrowser for help on using the repository browser.