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 c write (iout,*) "Before permut"
75 c write (iout,*) "symetr", symetr
78 c write (iout,*) "after permut"
80 print *,'MAIN: nnt=',nnt,' nct=',nct
86 IF (RCUTOFF(I).LT.0.0) THEN
87 RCUTOFF(I)=ABS(RCUTOFF(I))
93 write (iout,*) 'Number of cutoffs:',NCUT
94 write (iout,*) 'Cutoff values:'
96 WRITE(IOUT,'(8HRCUTOFF(,I2,2H)=,F8.1,2i2)')ICUT,RCUTOFF(ICUT),
97 & printpdb(icut),printmol2(icut)
105 call read_coords(ncon,*20)
106 write (iout,*) 'from read_coords: ncon',ncon
108 write (iout,*) "nT",nT
110 write (iout,*) "iT",iT
112 call work_partition(.true.,ncon)
115 call probabl(iT,ncon_work,ncon,*20)
117 if (ncon_work.lt.2) then
118 write (iout,*) "Too few conformations; clustering skipped"
122 ndis=ncon_work*(ncon_work-1)/2
123 call work_partition(.true.,ndis)
129 WRITE (iout,'(A80)') TITEL
132 C CALCULATE DISTANCES
134 call daread_ccoords(1,ncon_work)
137 if (mod(i,100).eq.0) print *,'Calculating RMS i=',i
140 c(l,k)=allcart(l,k,i)
149 IND=IOFFSET(NCON_work,I,J)
151 if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
154 DISS(IND1)=DIFCONF(I,J)
155 c write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
162 WRITE (iout,'(/a,1pe14.5,a/)')
163 & 'Time for distance calculation:',T2-T1,' sec.'
165 PRINT '(a)','End of distance computation'
168 call MPI_Gatherv(diss(1),scount(me),MPI_REAL,diss(1),
169 & scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
170 if (me.eq.master) then
172 open(80,file='/tmp/distance',form='unformatted')
179 IND=IOFFSET(NCON,I,J)
180 write (jrms,'(2i5,2f10.5)') i,j,diss(IND),
181 & energy(j)-energy(i)
186 C Print out the RMS deviation matrix.
188 if (print_dist) CALL DISTOUT(NCON_work)
190 C call hierarchical clustering HC from F. Murtagh
194 write(iout,*) "-------------------------------------------"
195 write(iout,*) "HIERARCHICAL CLUSTERING using"
197 write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
198 elseif (iopt.eq.2) then
199 write(iout,*) "SINGLE LINK METHOD"
200 elseif (iopt.eq.3) then
201 write(iout,*) "COMPLETE LINK METHOD"
202 elseif (iopt.eq.4) then
203 write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
204 elseif (iopt.eq.5) then
205 write(iout,*) "MCQUITTY'S METHOD"
206 elseif (iopt.eq.6) then
207 write(iout,*) "MEDIAN (GOWER'S) METHOD"
208 elseif (iopt.eq.7) then
209 write(iout,*) "CENTROID METHOD"
211 write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
212 write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
216 write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
217 write(iout,*) "February 1986"
218 write(iout,*) "References:"
219 write(iout,*) "1. Multidimensional clustering algorithms"
220 write(iout,*) " Fionn Murtagh"
221 write(iout,*) " Vienna : Physica-Verlag, 1985."
222 write(iout,*) "2. Multivariate data analysis"
223 write(iout,*) " Fionn Murtagh and Andre Heck"
224 write(iout,*) " Kluwer Academic Publishers, 1987"
225 write(iout,*) "-------------------------------------------"
229 write (iout,*) "The TOTFREE array"
231 write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
235 CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
237 write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
239 write (iout,*) "Too few conformations to cluster."
242 CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
243 c CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
252 licz(iclass(j,i))=licz(iclass(j,i))+1
253 nconf(iclass(j,i),licz(iclass(j,i)))=j
254 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
255 c & nconf(iclass(j,i),licz(iclass(j,i)))
261 IF (HEIGHT(L).EQ.IDUM) GOTO 190
264 write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),
265 & " icut",icut," cutoff",rcutoff(icut)
266 IF (CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
267 WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
268 write (iout,'(a,f8.2)') 'Maximum distance found:',
270 CALL SRTCLUST(ICUT,ncon_work,iT)
272 CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
274 if (icut.gt.ncut) goto 191
281 licz(iclass(j,i))=licz(iclass(j,i))+1
282 nconf(iclass(j,i),licz(iclass(j,i)))=j
283 c write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
284 c & nconf(iclass(j,i),licz(iclass(j,i)))
285 cd print *,j,iclass(j,i),
286 cd & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
297 WRITE (iout,'(/a,1pe14.5,a/)')
298 & 'Total time for clustering:',T2-T1,' sec.'
306 close(icbase,status="delete")
308 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
310 stop '********** Program terminated normally.'
311 20 write (iout,*) "Error reading coordinates"
313 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
316 30 write (iout,*) "Error reading reference structure"
318 call MPI_Finalize(MPI_COMM_WORLD,IERROR)
322 c---------------------------------------------------------------------------
323 double precision function difconf(icon,jcon)
326 include 'sizesclu.dat'
327 include 'COMMON.CONTROL'
328 include 'COMMON.CLUSTER'
329 include 'COMMON.CHAIN'
330 include 'COMMON.INTERACT'
332 include 'COMMON.IOUNITS'
334 double precision przes(3),obrot(3,3)
335 double precision xx(3,maxres2),yy(3,maxres2)
336 integer i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
337 integer iaperm,ibezperm,run
338 double precision rms,rmsmina
339 c write (iout,*) "tu dochodze"
345 c write (iout,*) "nperm",nperm
347 c write (iout,*) "tabperm", tabperm(1,1)
351 chalen=int((nend-nstart+2)/symetr)
353 do i=nstart,(nstart+chalen-1)
355 c write (iout,*) "tutaj",zzz
357 iaperm=(zzz-1)*chalen+i
358 ibezperm=(run-1)*chalen+i
360 xx(j,ii)=allcart(j,iaperm,jcon)
361 yy(j,ii)=cref(j,ibezperm)
366 do i=nstart,(nstart+chalen-1)
369 iaperm=(zzz-1)*chalen+i
370 ibezperm=(run-1)*chalen+i
371 c if (itype(i).ne.10) then
374 xx(j,ii)=allcart(j,iaperm+nres,jcon)
375 yy(j,ii)=cref(j,ibezperm+nres)
380 call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
382 chalen=int((nct-nnt+2)/symetr)
384 do i=nnt,(nnt+chalen-1)
386 c write (iout,*) "tu szukaj", zzz,run,kkk
387 iaperm=(zzz-1)*chalen+i
388 ibezperm=(run-1)*chalen+i
391 c(j,i)=allcart(j,iaperm,jcon)
395 call fitsq(rms,c(1,nstart),cref(1,nstart),nend-nstart+1,przes,
399 print *,'error, rms^2 = ',rms,icon,jcon
402 if (non_conv) print *,non_conv,icon,jcon
403 if (rmsmina.gt.rms) rmsmina=rms
405 difconf=dsqrt(rmsmina)
408 C------------------------------------------------------------------------------
409 subroutine distout(ncon)
412 include 'sizesclu.dat'
415 include 'COMMON.IOUNITS'
416 include 'COMMON.CLUSTER'
417 integer i,j,k,jlim,jlim1,nlim,ind,ioffset
420 write (iout,'(a)') 'The distance matrix'
422 nlim=min0(i+ncol-1,ncon)
423 write (iout,1000) (k,k=i,nlim)
424 write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
425 1000 format (/8x,10(i4,3x))
426 1020 format (/1x,80(1h-)/)
437 IND=IOFFSET(NCON,j,k)
439 IND=IOFFSET(NCON,k,j)
442 write (iout,1010) j,(b(k),k=1,jlim-i+1)
445 1010 format (i5,3x,10(f6.2,1x))