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
41 double precision varia(maxvar)
42 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
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)
150 IND=IOFFSET(NCON_work,I,J)
152 if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
156 DISS_(IND1)=DIFCONF(I,J)
158 DISS(IND1)=DIFCONF(I,J)
160 c write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
167 WRITE (iout,'(/a,1pe14.5,a/)')
168 & 'Time for distance calculation:',T2-T1,' sec.'
170 PRINT '(a)','End of distance computation'
173 call MPI_Gatherv(diss_(1),scount(me),MPI_REAL,diss(1),
174 & scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
175 if (me.eq.master) then
177 open(80,file='/tmp/distance',form='unformatted')
184 IND=IOFFSET(NCON,I,J)
185 write (jrms,'(2i5,2f10.5)') i,j,diss(IND),
186 & energy(j)-energy(i)
191 C Print out the RMS deviation matrix.
193 if (print_dist) CALL DISTOUT(NCON_work)
195 C call hierarchical clustering HC from F. Murtagh
199 write(iout,*) "-------------------------------------------"
200 write(iout,*) "HIERARCHICAL CLUSTERING using"
202 write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
203 elseif (iopt.eq.2) then
204 write(iout,*) "SINGLE LINK METHOD"
205 elseif (iopt.eq.3) then
206 write(iout,*) "COMPLETE LINK METHOD"
207 elseif (iopt.eq.4) then
208 write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
209 elseif (iopt.eq.5) then
210 write(iout,*) "MCQUITTY'S METHOD"
211 elseif (iopt.eq.6) then
212 write(iout,*) "MEDIAN (GOWER'S) METHOD"
213 elseif (iopt.eq.7) then
214 write(iout,*) "CENTROID METHOD"
216 write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
217 write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
221 write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
222 write(iout,*) "February 1986"
223 write(iout,*) "References:"
224 write(iout,*) "1. Multidimensional clustering algorithms"
225 write(iout,*) " Fionn Murtagh"
226 write(iout,*) " Vienna : Physica-Verlag, 1985."
227 write(iout,*) "2. Multivariate data analysis"
228 write(iout,*) " Fionn Murtagh and Andre Heck"
229 write(iout,*) " Kluwer Academic Publishers, 1987"
230 write(iout,*) "-------------------------------------------"
234 write (iout,*) "The TOTFREE array"
236 write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
240 CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
242 write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
244 write (iout,*) "Too few conformations to cluster."
247 CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
248 c CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
257 licz(iclass(j,i))=licz(iclass(j,i))+1
258 nconf(iclass(j,i),licz(iclass(j,i)))=j
259 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
260 c & nconf(iclass(j,i),licz(iclass(j,i)))
266 IF (HEIGHT(L).EQ.IDUM) GOTO 190
269 write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),
270 & " icut",icut," cutoff",rcutoff(icut)
271 IF (CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
272 WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
273 write (iout,'(a,f8.2)') 'Maximum distance found:',
275 CALL SRTCLUST(ICUT,ncon_work,iT)
277 CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
279 if (icut.gt.ncut) goto 191
286 licz(iclass(j,i))=licz(iclass(j,i))+1
287 nconf(iclass(j,i),licz(iclass(j,i)))=j
288 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
289 c & nconf(iclass(j,i),licz(iclass(j,i)))
290 cd print *,j,iclass(j,i),
291 cd & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
302 WRITE (iout,'(/a,1pe14.5,a/)')
303 & 'Total time for clustering:',T2-T1,' sec.'
311 close(icbase,status="delete")
313 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
315 stop '********** Program terminated normally.'
316 20 write (iout,*) "Error reading coordinates"
318 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
321 30 write (iout,*) "Error reading reference structure"
323 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
327 c---------------------------------------------------------------------------
328 double precision function difconf(icon,jcon)
331 include 'sizesclu.dat'
332 include 'COMMON.CONTROL'
333 include 'COMMON.CLUSTER'
334 include 'COMMON.CHAIN'
335 include 'COMMON.INTERACT'
337 include 'COMMON.IOUNITS'
339 double precision przes(3),obrot(3,3)
340 double precision xx(3,maxres2),yy(3,maxres2)
341 integer i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
342 integer iaperm,ibezperm,run
343 double precision rms,rmsmina
344 c write (iout,*) "tu dochodze"
350 c write (iout,*) "nperm",nperm
352 c write (iout,*) "tabperm", tabperm(1,1)
356 chalen=int((nend-nstart+2)/symetr)
358 do i=nstart,(nstart+chalen-1)
360 c write (iout,*) "tutaj",zzz
362 iaperm=(zzz-1)*chalen+i
363 ibezperm=(run-1)*chalen+i
365 xx(j,ii)=allcart(j,iaperm,jcon)
366 yy(j,ii)=cref(j,ibezperm)
371 do i=nstart,(nstart+chalen-1)
374 iaperm=(zzz-1)*chalen+i
375 ibezperm=(run-1)*chalen+i
376 c if (itype(i).ne.10) then
379 xx(j,ii)=allcart(j,iaperm+nres,jcon)
380 yy(j,ii)=cref(j,ibezperm+nres)
385 call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
387 chalen=int((nct-nnt+2)/symetr)
389 do i=nnt,(nnt+chalen-1)
391 c write (iout,*) "tu szukaj", zzz,run,kkk
392 iaperm=(zzz-1)*chalen+i
393 ibezperm=(run-1)*chalen+i
396 c(j,i)=allcart(j,iaperm,jcon)
400 call fitsq(rms,c(1,nstart),cref(1,nstart),nend-nstart+1,przes,
404 print *,'error, rms^2 = ',rms,icon,jcon
407 if (non_conv) print *,non_conv,icon,jcon
408 if (rmsmina.gt.rms) rmsmina=rms
410 difconf=dsqrt(rmsmina)
413 C------------------------------------------------------------------------------
414 subroutine distout(ncon)
417 include 'sizesclu.dat'
420 include 'COMMON.IOUNITS'
421 include 'COMMON.CLUSTER'
422 integer i,j,k,jlim,jlim1,nlim,ind,ioffset
425 write (iout,'(a)') 'The distance matrix'
427 nlim=min0(i+ncol-1,ncon)
428 write (iout,1000) (k,k=i,nlim)
429 write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
430 1000 format (/8x,10(i4,3x))
431 1020 format (/1x,80(1h-)/)
442 IND=IOFFSET(NCON,j,k)
444 IND=IOFFSET(NCON,k,j)
447 write (iout,1010) j,(b(k),k=1,jlim-i+1)
450 1010 format (i5,3x,10(f6.2,1x))