2 C Program to cluster united-residue MCM results.
9 integer IERROR,ERRCODE,STATUS(MPI_STATUS_SIZE)
12 include 'COMMON.TIME1'
13 include 'COMMON.INTERACT'
14 include 'COMMON.NAMES'
16 include 'COMMON.HEADER'
17 include 'COMMON.CONTROL'
18 include 'COMMON.CHAIN'
20 include 'COMMON.CLUSTER'
21 include 'COMMON.IOUNITS'
23 logical printang(max_cut)
24 integer printpdb(max_cut)
25 integer printmol2(max_cut)
27 REAL CRIT(maxconf),MEMBR(maxconf)
28 REAL CRITVAL(maxconf-1)
29 INTEGER IA(maxconf),IB(maxconf)
30 INTEGER ICLASS(maxconf,maxconf-1),HVALS(maxconf-1)
31 INTEGER IORDER(maxconf-1),HEIGHT(maxconf-1)
34 DIMENSION NN(maxconf),DISNN(maxconf)
36 integer i,j,k,l,m,n,len,lev,idum,ii,ind,ioffset,jj,icut,ncon,
38 double precision t1,t2,tcpu,difconf
40 double precision varia(maxvar)
41 double precision hrtime,mintime,sectime
44 call MPI_Init( IERROR )
45 call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR )
46 call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR )
49 write(iout,*) "SEVERE ERROR - Can't initialize MPI."
50 call mpi_finalize(ierror)
53 if (nprocs.gt.MaxProcs+1) then
54 write (2,*) "Error - too many processors",
56 write (2,*) "Increase MaxProcs and recompile"
57 call MPI_Finalize(IERROR)
67 c if (refstr) call read_ref_structure(*30)
74 write (iout,*) "symetr", symetr
76 print *,'MAIN: nnt=',nnt,' nct=',nct
82 IF (RCUTOFF(I).LT.0.0) THEN
83 RCUTOFF(I)=ABS(RCUTOFF(I))
89 write (iout,*) 'Number of cutoffs:',NCUT
90 write (iout,*) 'Cutoff values:'
92 WRITE(IOUT,'(8HRCUTOFF(,I2,2H)=,F8.1,2i2)')ICUT,RCUTOFF(ICUT),
93 & printpdb(icut),printmol2(icut)
101 call read_coords(ncon,*20)
102 write (iout,*) 'from read_coords: ncon',ncon
104 write (iout,*) "nT",nT
106 write (iout,*) "iT",iT
108 call work_partition(.true.,ncon)
111 call probabl(iT,ncon_work,ncon,*20)
113 if (ncon_work.lt.2) then
114 write (iout,*) "Too few conformations; clustering skipped"
118 ndis=ncon_work*(ncon_work-1)/2
119 call work_partition(.true.,ndis)
125 WRITE (iout,'(A80)') TITEL
128 C CALCULATE DISTANCES
130 call daread_ccoords(1,ncon_work)
133 if (mod(i,100).eq.0) print *,'Calculating RMS i=',i
136 c(l,k)=allcart(l,k,i)
145 IND=IOFFSET(NCON_work,I,J)
147 if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
150 DISS(IND1)=DIFCONF(I,J)
151 c write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
158 WRITE (iout,'(/a,1pe14.5,a/)')
159 & 'Time for distance calculation:',T2-T1,' sec.'
161 PRINT '(a)','End of distance computation'
164 call MPI_Gatherv(diss(1),scount(me),MPI_REAL,diss(1),
165 & scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
166 if (me.eq.master) then
168 open(80,file='/tmp/distance',form='unformatted')
175 IND=IOFFSET(NCON,I,J)
176 write (jrms,'(2i5,2f10.5)') i,j,diss(IND),
177 & energy(j)-energy(i)
182 C Print out the RMS deviation matrix.
184 if (print_dist) CALL DISTOUT(NCON_work)
186 C call hierarchical clustering HC from F. Murtagh
190 write(iout,*) "-------------------------------------------"
191 write(iout,*) "HIERARCHICAL CLUSTERING using"
193 write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
194 elseif (iopt.eq.2) then
195 write(iout,*) "SINGLE LINK METHOD"
196 elseif (iopt.eq.3) then
197 write(iout,*) "COMPLETE LINK METHOD"
198 elseif (iopt.eq.4) then
199 write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
200 elseif (iopt.eq.5) then
201 write(iout,*) "MCQUITTY'S METHOD"
202 elseif (iopt.eq.6) then
203 write(iout,*) "MEDIAN (GOWER'S) METHOD"
204 elseif (iopt.eq.7) then
205 write(iout,*) "CENTROID METHOD"
207 write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
208 write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
212 write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
213 write(iout,*) "February 1986"
214 write(iout,*) "References:"
215 write(iout,*) "1. Multidimensional clustering algorithms"
216 write(iout,*) " Fionn Murtagh"
217 write(iout,*) " Vienna : Physica-Verlag, 1985."
218 write(iout,*) "2. Multivariate data analysis"
219 write(iout,*) " Fionn Murtagh and Andre Heck"
220 write(iout,*) " Kluwer Academic Publishers, 1987"
221 write(iout,*) "-------------------------------------------"
225 write (iout,*) "The TOTFREE array"
227 write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
231 CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
233 write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
235 write (iout,*) "Too few conformations to cluster."
238 CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
239 c CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
248 licz(iclass(j,i))=licz(iclass(j,i))+1
249 nconf(iclass(j,i),licz(iclass(j,i)))=j
250 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
251 c & nconf(iclass(j,i),licz(iclass(j,i)))
257 IF (HEIGHT(L).EQ.IDUM) GOTO 190
260 write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),
261 & " icut",icut," cutoff",rcutoff(icut)
262 IF (CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
263 WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
264 write (iout,'(a,f8.2)') 'Maximum distance found:',
266 CALL SRTCLUST(ICUT,ncon_work,iT)
268 CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
270 if (icut.gt.ncut) goto 191
277 licz(iclass(j,i))=licz(iclass(j,i))+1
278 nconf(iclass(j,i),licz(iclass(j,i)))=j
279 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
280 c & nconf(iclass(j,i),licz(iclass(j,i)))
281 cd print *,j,iclass(j,i),
282 cd & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
293 WRITE (iout,'(/a,1pe14.5,a/)')
294 & 'Total time for clustering:',T2-T1,' sec.'
302 close(icbase,status="delete")
304 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
306 stop '********** Program terminated normally.'
307 20 write (iout,*) "Error reading coordinates"
309 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
312 30 write (iout,*) "Error reading reference structure"
314 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
318 c---------------------------------------------------------------------------
319 double precision function difconf(icon,jcon)
322 include 'sizesclu.dat'
323 include 'COMMON.CONTROL'
324 include 'COMMON.CLUSTER'
325 include 'COMMON.CHAIN'
326 include 'COMMON.INTERACT'
328 include 'COMMON.IOUNITS'
330 double precision przes(3),obrot(3,3)
331 double precision xx(3,maxres2),yy(3,maxres2)
332 integer i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
333 integer iaperm,ibezperm,run
334 double precision rms,rmsmina
335 c write (iout,*) "tu dochodze"
341 c write (iout,*) "nperm",nperm
343 c write (iout,*) "tabperm", tabperm(1,1)
347 chalen=int((nend-nstart+2)/symetr)
349 do i=nstart,(nstart+chalen-1)
351 c write (iout,*) "tutaj",zzz
353 iaperm=(zzz-1)*chalen+i
354 ibezperm=(run-1)*chalen+i
356 xx(j,ii)=allcart(j,iaperm,jcon)
357 yy(j,ii)=cref(j,ibezperm)
362 do i=nstart,(nstart+chalen-1)
365 iaperm=(zzz-1)*chalen+i
366 ibezperm=(run-1)*chalen+i
367 c if (itype(i).ne.10) then
370 xx(j,ii)=allcart(j,iaperm+nres,jcon)
371 yy(j,ii)=cref(j,ibezperm+nres)
376 call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
378 chalen=int((nct-nnt+2)/symetr)
380 do i=nnt,(nnt+chalen-1)
382 c write (iout,*) "tu szukaj", zzz,run,kkk
383 iaperm=(zzz-1)*chalen+i
384 ibezperm=(run-1)*chalen+i
387 c(j,i)=allcart(j,iaperm,jcon)
391 call fitsq(rms,c(1,nstart),cref(1,nstart),nend-nstart+1,przes,
395 print *,'error, rms^2 = ',rms,icon,jcon
398 if (non_conv) print *,non_conv,icon,jcon
399 if (rmsmina.gt.rms) rmsmina=rms
401 difconf=dsqrt(rmsmina)
404 C------------------------------------------------------------------------------
405 subroutine distout(ncon)
408 include 'sizesclu.dat'
411 include 'COMMON.IOUNITS'
412 include 'COMMON.CLUSTER'
413 integer i,j,k,jlim,jlim1,nlim,ind,ioffset
416 write (iout,'(a)') 'The distance matrix'
418 nlim=min0(i+ncol-1,ncon)
419 write (iout,1000) (k,k=i,nlim)
420 write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
421 1000 format (/8x,10(i4,3x))
422 1020 format (/1x,80(1h-)/)
433 IND=IOFFSET(NCON,j,k)
435 IND=IOFFSET(NCON,k,j)
438 write (iout,1010) j,(b(k),k=1,jlim-i+1)
441 1010 format (i5,3x,10(f6.2,1x))