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)
26 character*240 lineh,scrachdir2d
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,is,ie,ilen
38 double precision t1,t2,tcpu,difconf
40 double precision varia(maxvar)
41 double precision hrtime,mintime,sectime
46 call MPI_Init( IERROR )
47 call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR )
48 call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR )
51 write(iout,*) "SEVERE ERROR - Can't initialize MPI."
52 call mpi_finalize(ierror)
55 if (nprocs.gt.MaxProcs+1) then
56 write (2,*) "Error - too many processors",
58 write (2,*) "Increase MaxProcs and recompile"
59 call MPI_Finalize(IERROR)
70 c if (refstr) call read_ref_structure(*30)
77 c write (iout,*) "Before permut"
78 c write (iout,*) "symetr", symetr
81 c write (iout,*) "after permut"
83 print *,'MAIN: nnt=',nnt,' nct=',nct
95 IF (RCUTOFF(I).LT.0.0) THEN
96 RCUTOFF(I)=ABS(RCUTOFF(I))
104 write (iout,*) 'Number of cutoffs:',NCUT
105 write (iout,*) 'Cutoff values:'
107 WRITE(IOUT,'(8HRCUTOFF(,I2,2H)=,F8.1,2i2)')ICUT,RCUTOFF(ICUT),
108 & printpdb(icut),printmol2(icut)
110 else if (nclust.gt.0) then
111 write (iout,'("Number of clusters requested",i5)') nclust
114 & write (iout,*) "ERROR: Either nclust or ncut must be >0"
123 call read_coords(ncon,*20)
124 write (iout,*) 'from read_coords: ncon',ncon
126 write (iout,*) "nT",nT
133 write (iout,*) "iT",iT
135 call work_partition(.true.,ncon)
138 call probabl(iT,ncon_work,ncon,*20)
140 if (ncon_work.lt.2) then
141 write (iout,*) "Too few conformations; clustering skipped"
145 ndis=ncon_work*(ncon_work-1)/2
146 call work_partition(.true.,ndis)
148 write(iout,*) "AFTET wort_part",NCON_work
152 WRITE (iout,'(A80)') TITEL
155 C CALCULATE DISTANCES
157 call daread_ccoords(1,ncon_work)
160 if (mod(i,100).eq.0) print *,'Calculating RMS i=',i
163 c(l,k)=allcart(l,k,i)
173 IND=IOFFSET(NCON_work,I,J)
175 if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
178 DISS(IND1)=DIFCONF(I,J)
179 c write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
186 WRITE (iout,'(/a,1pe14.5,a/)')
187 & 'Time for distance calculation:',T2-T1,' sec.'
189 PRINT '(a)','End of distance computation'
191 scount_buf=scount(me)
194 diss_buf(ijk)=diss(ijk)
199 c WRITE (iout,*) "Wchodze do call MPI_Gatherv"
200 call MPI_Gatherv(diss_buf(1),scount_buf,MPI_REAL,diss(1),
201 & scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
202 if (me.eq.master) then
204 scrachdir2d=scratchdir(:ilen(scratchdir))//'distance'
205 open(80,file=scrachdir2d,form='unformatted')
212 IND=IOFFSET(NCON,I,J)
213 write (jrms,'(2i5,2f10.5)') i,j,diss(IND),
214 & energy(j)-energy(i)
219 C Print out the RMS deviation matrix.
221 if (print_dist) CALL DISTOUT(NCON_work)
223 C call hierarchical clustering HC from F. Murtagh
227 write(iout,*) "-------------------------------------------"
228 write(iout,*) "HIERARCHICAL CLUSTERING using"
230 write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
231 elseif (iopt.eq.2) then
232 write(iout,*) "SINGLE LINK METHOD"
233 elseif (iopt.eq.3) then
234 write(iout,*) "COMPLETE LINK METHOD"
235 elseif (iopt.eq.4) then
236 write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
237 elseif (iopt.eq.5) then
238 write(iout,*) "MCQUITTY'S METHOD"
239 elseif (iopt.eq.6) then
240 write(iout,*) "MEDIAN (GOWER'S) METHOD"
241 elseif (iopt.eq.7) then
242 write(iout,*) "CENTROID METHOD"
244 write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
245 write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
249 write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
250 write(iout,*) "February 1986"
251 write(iout,*) "References:"
252 write(iout,*) "1. Multidimensional clustering algorithms"
253 write(iout,*) " Fionn Murtagh"
254 write(iout,*) " Vienna : Physica-Verlag, 1985."
255 write(iout,*) "2. Multivariate data analysis"
256 write(iout,*) " Fionn Murtagh and Andre Heck"
257 write(iout,*) " Kluwer Academic Publishers, 1987"
258 write(iout,*) "-------------------------------------------"
262 write (iout,*) "The TOTFREE array"
264 write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
268 CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
270 write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
272 write (iout,*) "Too few conformations to cluster."
275 CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
276 c CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
278 c 3/3/16 AL: added explicit number of cluters
279 if (nclust.gt.0) then
294 licz(iclass(j,i))=licz(iclass(j,i))+1
295 nconf(iclass(j,i),licz(iclass(j,i)))=j
296 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
297 c & nconf(iclass(j,i),licz(iclass(j,i)))
303 IF (HEIGHT(L).EQ.IDUM) GOTO 190
306 c write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),
307 c & " icut",icut," cutoff",rcutoff(icut)
308 IF (nclust.gt.0.or.CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
310 & WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
311 write (iout,'(a,f8.2)') 'Maximum distance found:',
313 CALL SRTCLUST(ICUT,ncon_work,iT)
315 CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
317 if (icut.gt.ncut) goto 191
325 licz(iclass(j,ii))=licz(iclass(j,ii))+1
326 nconf(iclass(j,ii),licz(iclass(j,ii)))=j
327 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
328 c & nconf(iclass(j,i),licz(iclass(j,i)))
329 cd print *,j,iclass(j,i),
330 cd & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
341 WRITE (iout,'(/a,1pe14.5,a/)')
342 & 'Total time for clustering:',T2-T1,' sec.'
350 close(icbase,status="delete")
352 call MPI_Finalize(IERROR)
354 stop '********** Program terminated normally.'
355 20 write (iout,*) "Error reading coordinates"
357 call MPI_Finalize(IERROR)
360 30 write (iout,*) "Error reading reference structure"
362 call MPI_Finalize(IERROR)
366 c---------------------------------------------------------------------------
367 double precision function difconf(icon,jcon)
370 include 'sizesclu.dat'
371 include 'COMMON.CONTROL'
372 include 'COMMON.CLUSTER'
373 include 'COMMON.CHAIN'
374 include 'COMMON.INTERACT'
376 include 'COMMON.IOUNITS'
378 double precision przes(3),obrot(3,3)
379 double precision xx(3,maxres2),yy(3,maxres2)
380 integer i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
381 integer iaperm,ibezperm,run
382 double precision rms,rmsmina
383 c write (iout,*) "tu dochodze"
389 c write (iout,*) "nperm",nperm
391 c write (iout,*) "tabperm", tabperm(1,1)
395 chalen=int((nend-nstart+2)/symetr)
397 do i=nstart,(nstart+chalen-1)
399 c write (iout,*) "tutaj",zzz
401 iaperm=(zzz-1)*chalen+i
402 ibezperm=(run-1)*chalen+i
404 xx(j,ii)=allcart(j,iaperm,jcon)
405 yy(j,ii)=cref(j,ibezperm,kkk)
410 do i=nstart,(nstart+chalen-1)
413 iaperm=(zzz-1)*chalen+i
414 ibezperm=(run-1)*chalen+i
415 c if (itype(i).ne.10) then
418 xx(j,ii)=allcart(j,iaperm+nres,jcon)
419 yy(j,ii)=cref(j,ibezperm+nres,kkk)
424 call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
426 chalen=int((nct-nnt+2)/symetr)
428 do i=nnt,(nnt+chalen-1)
430 c write (iout,*) "tu szukaj", zzz,run,kkk
431 iaperm=(zzz-1)*chalen+i
432 ibezperm=(run-1)*chalen+i
435 c(j,i)=allcart(j,iaperm,jcon)
439 call fitsq(rms,c(1,nstart),cref(1,nstart,kkk),nend-nstart+1,
444 print *,'error, rms^2 = ',rms,icon,jcon
447 if (non_conv) print *,non_conv,icon,jcon
448 if (rmsmina.gt.rms) rmsmina=rms
450 difconf=dsqrt(rmsmina)
453 C------------------------------------------------------------------------------
454 subroutine distout(ncon)
457 include 'sizesclu.dat'
460 include 'COMMON.IOUNITS'
461 include 'COMMON.CLUSTER'
462 integer i,j,k,jlim,jlim1,nlim,ind,ioffset
465 write (iout,'(a)') 'The distance matrix'
467 nlim=min0(i+ncol-1,ncon)
468 write (iout,1000) (k,k=i,nlim)
469 write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
470 1000 format (/8x,10(i4,3x))
471 1020 format (/1x,80(1h-)/)
482 IND=IOFFSET(NCON,j,k)
484 IND=IOFFSET(NCON,k,j)
487 write (iout,1010) j,(b(k),k=1,jlim-i+1)
490 1010 format (i5,3x,10(f6.2,1x))