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
45 call MPI_Init( IERROR )
46 call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR )
47 call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR )
50 write(iout,*) "SEVERE ERROR - Can't initialize MPI."
51 call mpi_finalize(ierror)
54 if (nprocs.gt.MaxProcs+1) then
55 write (2,*) "Error - too many processors",
57 write (2,*) "Increase MaxProcs and recompile"
58 call MPI_Finalize(IERROR)
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
93 IF (RCUTOFF(I).LT.0.0) THEN
94 RCUTOFF(I)=ABS(RCUTOFF(I))
102 write (iout,*) 'Number of cutoffs:',NCUT
103 write (iout,*) 'Cutoff values:'
105 WRITE(IOUT,'(8HRCUTOFF(,I2,2H)=,F8.1,2i2)')ICUT,RCUTOFF(ICUT),
106 & printpdb(icut),printmol2(icut)
108 else if (nclust.gt.0) then
109 write (iout,'("Number of clusters requested",i5)') nclust
112 & write (iout,*) "ERROR: Either nclust or ncut must be >0"
121 call read_coords(ncon,*20)
122 write (iout,*) 'from read_coords: ncon',ncon
124 write (iout,*) "nT",nT
126 write (iout,*) "iT",iT
128 call work_partition(.true.,ncon)
131 call probabl(iT,ncon_work,ncon,*20)
133 if (ncon_work.lt.2) then
134 write (iout,*) "Too few conformations; clustering skipped"
138 ndis=ncon_work*(ncon_work-1)/2
139 call work_partition(.true.,ndis)
141 write(iout,*) "AFTET wort_part",NCON_work
145 WRITE (iout,'(A80)') TITEL
148 C CALCULATE DISTANCES
150 call daread_ccoords(1,ncon_work)
151 write (iout,*) "AM I HERE"
155 if (mod(i,100).eq.0) print *,'Calculating RMS i=',i
158 c(l,k)=allcart(l,k,i)
168 IND=IOFFSET(NCON_work,I,J)
170 if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
173 DISS(IND1)=DIFCONF(I,J)
174 c write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
181 WRITE (iout,'(/a,1pe14.5,a/)')
182 & 'Time for distance calculation:',T2-T1,' sec.'
184 PRINT '(a)','End of distance computation'
186 scount_buf=scount(me)
189 diss_buf(ijk)=diss(ijk)
194 WRITE (iout,*) "Wchodze do call MPI_Gatherv"
195 call MPI_Gatherv(diss_buf(1),scount_buf,MPI_REAL,diss(1),
196 & scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
197 if (me.eq.master) then
199 scrachdir2d=scratchdir(:ilen(scratchdir))//'distance'
200 open(80,file=scrachdir2d,form='unformatted')
207 IND=IOFFSET(NCON,I,J)
208 write (jrms,'(2i5,2f10.5)') i,j,diss(IND),
209 & energy(j)-energy(i)
214 C Print out the RMS deviation matrix.
216 if (print_dist) CALL DISTOUT(NCON_work)
218 C call hierarchical clustering HC from F. Murtagh
222 write(iout,*) "-------------------------------------------"
223 write(iout,*) "HIERARCHICAL CLUSTERING using"
225 write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
226 elseif (iopt.eq.2) then
227 write(iout,*) "SINGLE LINK METHOD"
228 elseif (iopt.eq.3) then
229 write(iout,*) "COMPLETE LINK METHOD"
230 elseif (iopt.eq.4) then
231 write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
232 elseif (iopt.eq.5) then
233 write(iout,*) "MCQUITTY'S METHOD"
234 elseif (iopt.eq.6) then
235 write(iout,*) "MEDIAN (GOWER'S) METHOD"
236 elseif (iopt.eq.7) then
237 write(iout,*) "CENTROID METHOD"
239 write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
240 write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
244 write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
245 write(iout,*) "February 1986"
246 write(iout,*) "References:"
247 write(iout,*) "1. Multidimensional clustering algorithms"
248 write(iout,*) " Fionn Murtagh"
249 write(iout,*) " Vienna : Physica-Verlag, 1985."
250 write(iout,*) "2. Multivariate data analysis"
251 write(iout,*) " Fionn Murtagh and Andre Heck"
252 write(iout,*) " Kluwer Academic Publishers, 1987"
253 write(iout,*) "-------------------------------------------"
257 write (iout,*) "The TOTFREE array"
259 write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
263 CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
265 write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
267 write (iout,*) "Too few conformations to cluster."
270 CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
271 c CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
273 c 3/3/16 AL: added explicit number of cluters
274 if (nclust.gt.0) then
289 licz(iclass(j,i))=licz(iclass(j,i))+1
290 nconf(iclass(j,i),licz(iclass(j,i)))=j
291 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
292 c & nconf(iclass(j,i),licz(iclass(j,i)))
298 IF (HEIGHT(L).EQ.IDUM) GOTO 190
301 c write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),
302 c & " icut",icut," cutoff",rcutoff(icut)
303 IF (nclust.gt.0.or.CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
305 & WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
306 write (iout,'(a,f8.2)') 'Maximum distance found:',
308 CALL SRTCLUST(ICUT,ncon_work,iT)
310 CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
312 if (icut.gt.ncut) goto 191
320 licz(iclass(j,ii))=licz(iclass(j,ii))+1
321 nconf(iclass(j,ii),licz(iclass(j,ii)))=j
322 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
323 c & nconf(iclass(j,i),licz(iclass(j,i)))
324 cd print *,j,iclass(j,i),
325 cd & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
336 WRITE (iout,'(/a,1pe14.5,a/)')
337 & 'Total time for clustering:',T2-T1,' sec.'
345 close(icbase,status="delete")
347 call MPI_Finalize(IERROR)
349 stop '********** Program terminated normally.'
350 20 write (iout,*) "Error reading coordinates"
352 call MPI_Finalize(IERROR)
355 30 write (iout,*) "Error reading reference structure"
357 call MPI_Finalize(IERROR)
361 c---------------------------------------------------------------------------
362 double precision function difconf(icon,jcon)
365 include 'sizesclu.dat'
366 include 'COMMON.CONTROL'
367 include 'COMMON.CLUSTER'
368 include 'COMMON.CHAIN'
369 include 'COMMON.INTERACT'
371 include 'COMMON.IOUNITS'
373 double precision przes(3),obrot(3,3)
374 double precision xx(3,maxres2),yy(3,maxres2)
375 integer i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
376 integer iaperm,ibezperm,run
377 double precision rms,rmsmina
378 c write (iout,*) "tu dochodze"
384 c write (iout,*) "nperm",nperm
386 c write (iout,*) "tabperm", tabperm(1,1)
390 chalen=int((nend-nstart+2)/symetr)
392 do i=nstart,(nstart+chalen-1)
394 c write (iout,*) "tutaj",zzz
396 iaperm=(zzz-1)*chalen+i
397 ibezperm=(run-1)*chalen+i
399 xx(j,ii)=allcart(j,iaperm,jcon)
400 yy(j,ii)=cref(j,ibezperm,kkk)
405 do i=nstart,(nstart+chalen-1)
408 iaperm=(zzz-1)*chalen+i
409 ibezperm=(run-1)*chalen+i
410 c if (itype(i).ne.10) then
413 xx(j,ii)=allcart(j,iaperm+nres,jcon)
414 yy(j,ii)=cref(j,ibezperm+nres,kkk)
419 call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
421 chalen=int((nct-nnt+2)/symetr)
423 do i=nnt,(nnt+chalen-1)
425 c write (iout,*) "tu szukaj", zzz,run,kkk
426 iaperm=(zzz-1)*chalen+i
427 ibezperm=(run-1)*chalen+i
430 c(j,i)=allcart(j,iaperm,jcon)
434 call fitsq(rms,c(1,nstart),cref(1,nstart,kkk),nend-nstart+1,
439 print *,'error, rms^2 = ',rms,icon,jcon
442 if (non_conv) print *,non_conv,icon,jcon
443 if (rmsmina.gt.rms) rmsmina=rms
445 difconf=dsqrt(rmsmina)
448 C------------------------------------------------------------------------------
449 subroutine distout(ncon)
452 include 'sizesclu.dat'
455 include 'COMMON.IOUNITS'
456 include 'COMMON.CLUSTER'
457 integer i,j,k,jlim,jlim1,nlim,ind,ioffset
460 write (iout,'(a)') 'The distance matrix'
462 nlim=min0(i+ncol-1,ncon)
463 write (iout,1000) (k,k=i,nlim)
464 write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
465 1000 format (/8x,10(i4,3x))
466 1020 format (/1x,80(1h-)/)
477 IND=IOFFSET(NCON,j,k)
479 IND=IOFFSET(NCON,k,j)
482 write (iout,1010) j,(b(k),k=1,jlim-i+1)
485 1010 format (i5,3x,10(f6.2,1x))