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)
32 integer nn,ndis,scount_buf
33 real*4 DISNN, diss_buf(maxdist)
34 DIMENSION NN(maxconf),DISNN(maxconf)
36 integer i,j,k,l,m,n,len,lev,idum,ii,ind,ioffset,jj,icut,ncon,
37 & it,ncon_work,ind1,kkk, ijk
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)
66 write(iout,*) "afert readcontrol"
68 c if (refstr) call read_ref_structure(*30)
75 c write (iout,*) "Before permut"
76 c write (iout,*) "symetr", symetr
79 c write (iout,*) "after permut"
81 print *,'MAIN: nnt=',nnt,' nct=',nct
87 IF (RCUTOFF(I).LT.0.0) THEN
88 RCUTOFF(I)=ABS(RCUTOFF(I))
94 write (iout,*) 'Number of cutoffs:',NCUT
95 write (iout,*) 'Cutoff values:'
97 WRITE(IOUT,'(8HRCUTOFF(,I2,2H)=,F8.1,2i2)')ICUT,RCUTOFF(ICUT),
98 & printpdb(icut),printmol2(icut)
106 call read_coords(ncon,*20)
107 write (iout,*) 'from read_coords: ncon',ncon
109 write (iout,*) "nT",nT
111 write (iout,*) "iT",iT
113 call work_partition(.true.,ncon)
116 call probabl(iT,ncon_work,ncon,*20)
118 if (ncon_work.lt.2) then
119 write (iout,*) "Too few conformations; clustering skipped"
123 ndis=ncon_work*(ncon_work-1)/2
124 call work_partition(.true.,ndis)
130 WRITE (iout,'(A80)') TITEL
133 C CALCULATE DISTANCES
135 call daread_ccoords(1,ncon_work)
138 if (mod(i,100).eq.0) print *,'Calculating RMS i=',i
141 c(l,k)=allcart(l,k,i)
151 IND=IOFFSET(NCON_work,I,J)
153 if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
156 DISS(IND1)=DIFCONF(I,J)
157 c write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
164 WRITE (iout,'(/a,1pe14.5,a/)')
165 & 'Time for distance calculation:',T2-T1,' sec.'
167 PRINT '(a)','End of distance computation'
169 scount_buf=scount(me)
172 diss_buf(ijk)=diss(ijk)
177 WRITE (iout,*) "Wchodze do call MPI_Gatherv"
178 call MPI_Gatherv(diss_buf(1),scount_buf,MPI_REAL,diss(1),
179 & scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
180 if (me.eq.master) then
182 open(80,file='/tmp/distance',form='unformatted')
189 IND=IOFFSET(NCON,I,J)
190 write (jrms,'(2i5,2f10.5)') i,j,diss(IND),
191 & energy(j)-energy(i)
196 C Print out the RMS deviation matrix.
198 if (print_dist) CALL DISTOUT(NCON_work)
200 C call hierarchical clustering HC from F. Murtagh
204 write(iout,*) "-------------------------------------------"
205 write(iout,*) "HIERARCHICAL CLUSTERING using"
207 write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
208 elseif (iopt.eq.2) then
209 write(iout,*) "SINGLE LINK METHOD"
210 elseif (iopt.eq.3) then
211 write(iout,*) "COMPLETE LINK METHOD"
212 elseif (iopt.eq.4) then
213 write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
214 elseif (iopt.eq.5) then
215 write(iout,*) "MCQUITTY'S METHOD"
216 elseif (iopt.eq.6) then
217 write(iout,*) "MEDIAN (GOWER'S) METHOD"
218 elseif (iopt.eq.7) then
219 write(iout,*) "CENTROID METHOD"
221 write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
222 write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
226 write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
227 write(iout,*) "February 1986"
228 write(iout,*) "References:"
229 write(iout,*) "1. Multidimensional clustering algorithms"
230 write(iout,*) " Fionn Murtagh"
231 write(iout,*) " Vienna : Physica-Verlag, 1985."
232 write(iout,*) "2. Multivariate data analysis"
233 write(iout,*) " Fionn Murtagh and Andre Heck"
234 write(iout,*) " Kluwer Academic Publishers, 1987"
235 write(iout,*) "-------------------------------------------"
239 write (iout,*) "The TOTFREE array"
241 write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
245 CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
247 write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
249 write (iout,*) "Too few conformations to cluster."
252 CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
253 c CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
262 licz(iclass(j,i))=licz(iclass(j,i))+1
263 nconf(iclass(j,i),licz(iclass(j,i)))=j
264 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
265 c & nconf(iclass(j,i),licz(iclass(j,i)))
271 IF (HEIGHT(L).EQ.IDUM) GOTO 190
274 write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),
275 & " icut",icut," cutoff",rcutoff(icut)
276 IF (CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
277 WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
278 write (iout,'(a,f8.2)') 'Maximum distance found:',
280 CALL SRTCLUST(ICUT,ncon_work,iT)
282 CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
284 if (icut.gt.ncut) goto 191
291 licz(iclass(j,i))=licz(iclass(j,i))+1
292 nconf(iclass(j,i),licz(iclass(j,i)))=j
293 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
294 c & nconf(iclass(j,i),licz(iclass(j,i)))
295 cd print *,j,iclass(j,i),
296 cd & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
307 WRITE (iout,'(/a,1pe14.5,a/)')
308 & 'Total time for clustering:',T2-T1,' sec.'
316 close(icbase,status="delete")
318 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
320 stop '********** Program terminated normally.'
321 20 write (iout,*) "Error reading coordinates"
323 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
326 30 write (iout,*) "Error reading reference structure"
328 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
332 c---------------------------------------------------------------------------
333 double precision function difconf(icon,jcon)
336 include 'sizesclu.dat'
337 include 'COMMON.CONTROL'
338 include 'COMMON.CLUSTER'
339 include 'COMMON.CHAIN'
340 include 'COMMON.INTERACT'
342 include 'COMMON.IOUNITS'
344 double precision przes(3),obrot(3,3)
345 double precision xx(3,maxres2),yy(3,maxres2)
346 integer i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
347 integer iaperm,ibezperm,run
348 double precision rms,rmsmina
349 c write (iout,*) "tu dochodze"
355 c write (iout,*) "nperm",nperm
357 c write (iout,*) "tabperm", tabperm(1,1)
361 chalen=int((nend-nstart+2)/symetr)
363 do i=nstart,(nstart+chalen-1)
365 c write (iout,*) "tutaj",zzz
367 iaperm=(zzz-1)*chalen+i
368 ibezperm=(run-1)*chalen+i
370 xx(j,ii)=allcart(j,iaperm,jcon)
371 yy(j,ii)=cref(j,ibezperm,kkk)
376 do i=nstart,(nstart+chalen-1)
379 iaperm=(zzz-1)*chalen+i
380 ibezperm=(run-1)*chalen+i
381 c if (itype(i).ne.10) then
384 xx(j,ii)=allcart(j,iaperm+nres,jcon)
385 yy(j,ii)=cref(j,ibezperm+nres,kkk)
390 call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
392 chalen=int((nct-nnt+2)/symetr)
394 do i=nnt,(nnt+chalen-1)
396 c write (iout,*) "tu szukaj", zzz,run,kkk
397 iaperm=(zzz-1)*chalen+i
398 ibezperm=(run-1)*chalen+i
401 c(j,i)=allcart(j,iaperm,jcon)
405 call fitsq(rms,c(1,nstart),cref(1,nstart,kkk),nend-nstart+1,
410 print *,'error, rms^2 = ',rms,icon,jcon
413 if (non_conv) print *,non_conv,icon,jcon
414 if (rmsmina.gt.rms) rmsmina=rms
416 difconf=dsqrt(rmsmina)
419 C------------------------------------------------------------------------------
420 subroutine distout(ncon)
423 include 'sizesclu.dat'
426 include 'COMMON.IOUNITS'
427 include 'COMMON.CLUSTER'
428 integer i,j,k,jlim,jlim1,nlim,ind,ioffset
431 write (iout,'(a)') 'The distance matrix'
433 nlim=min0(i+ncol-1,ncon)
434 write (iout,1000) (k,k=i,nlim)
435 write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
436 1000 format (/8x,10(i4,3x))
437 1020 format (/1x,80(1h-)/)
448 IND=IOFFSET(NCON,j,k)
450 IND=IOFFSET(NCON,k,j)
453 write (iout,1010) j,(b(k),k=1,jlim-i+1)
456 1010 format (i5,3x,10(f6.2,1x))