--- /dev/null
+ program cluster
+!
+! Program to cluster united-residue MCM results.
+!
+ use clust_data
+ use probability
+ use tracking
+ use hc_
+ use io_clust
+!#define CLUSTER
+ use io_units
+ use io_base, only: permut
+ use geometry_data, only: nres,theta,phi,alph,omeg,&
+ c,cref
+ use energy_data, only: nnt,nct
+ use control_data, only: symetr,outpdb,outmol2,titel,&
+ iopt,print_dist,MaxProcs
+ use control, only: tcpu,initialize
+
+ use wham_data, only: punch_dist
+ use io_wham, only: parmread
+ use work_part
+! include 'DIMENSIONS'
+! include 'sizesclu.dat'
+#ifdef MPI
+ use mpi_data
+ implicit none
+ include "mpif.h"
+ integer :: IERROR,ERRCODE !STATUS(MPI_STATUS_SIZE)
+#else
+ implicit none
+! include "COMMON.MPI"
+#endif
+! include 'COMMON.TIME1'
+! include 'COMMON.INTERACT'
+! include 'COMMON.NAMES'
+! include 'COMMON.GEO'
+! include 'COMMON.HEADER'
+! include 'COMMON.CONTROL'
+! include 'COMMON.CHAIN'
+! include 'COMMON.VAR'
+! include 'COMMON.CLUSTER'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.FREE'
+
+ logical,dimension(:),allocatable :: printang !(max_cut)
+ integer,dimension(:),allocatable :: printpdb !(max_cut)
+ integer,dimension(:),allocatable :: printmol2 !(max_cut)
+ character(len=240) lineh
+ REAL(kind=4),dimension(:),allocatable :: CRIT,MEMBR !(maxconf)
+ REAL(kind=4),dimension(:),allocatable :: CRITVAL !(maxconf-1)
+ INTEGER,dimension(:),allocatable :: IA,IB !(maxconf)
+ INTEGER,dimension(:,:),allocatable :: ICLASS !(maxconf,maxconf-1)
+ INTEGER,dimension(:),allocatable :: HVALS !(maxconf-1)
+ INTEGER,dimension(:),allocatable :: IORDER,HEIGHT !(maxconf-1)
+ integer,dimension(:),allocatable :: nn !(maxconf)
+ integer :: ndis
+ real(kind=4),dimension(:),allocatable :: DISNN !(maxconf)
+ LOGICAL,dimension(:),allocatable :: FLAG !(maxconf)
+ integer :: i,j,k,l,m,n,len,lev,idum,ii,ind,jj,icut,ncon,&
+ it,ncon_work,ind1,kkk
+ real(kind=8) :: t1,t2,difconf
+
+ real(kind=8),dimension(:),allocatable :: varia !(maxvar)
+ real(kind=8),dimension(:),allocatable :: list_conf_ !(maxvar)
+ real(kind=8) :: hrtime,mintime,sectime
+ logical :: eof
+ external :: difconf
+!el
+ real(kind=4),dimension(:),allocatable :: diss_ !(maxdist)
+ integer,dimension(:),allocatable :: scount_ !(maxdist)
+#ifdef MPI
+ call MPI_Init( IERROR )
+ call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR )
+ call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR )
+ Master = 0
+ if (ierror.gt.0) then
+ write(iout,*) "SEVERE ERROR - Can't initialize MPI."
+ call mpi_finalize(ierror)
+ stop
+ endif
+ if (nprocs.gt.MaxProcs+1) then
+ write (2,*) "Error - too many processors",&
+ nprocs,MaxProcs+1
+ write (2,*) "Increase MaxProcs and recompile"
+ call MPI_Finalize(IERROR)
+ stop
+ endif
+#endif
+!elwrite(iout,*) "before parmread"
+ allocate(printang(max_cut))
+ allocate(printpdb(max_cut))
+ allocate(printmol2(max_cut))
+ call initialize
+!elwrite(iout,*) "before parmread"
+ call openunits
+!elwrite(iout,*) "before parmread"
+ call parmread
+ call read_control
+!elwrite(iout,*) "after read control"
+ call molread
+! if (refstr) call read_ref_structure(*30)
+ do i=1,nres
+ phi(i)=0.0D0
+ theta(i)=0.0D0
+ alph(i)=0.0D0
+ omeg(i)=0.0D0
+ enddo
+! write (iout,*) "Before permut"
+! write (iout,*) "symetr", symetr
+! call flush(iout)
+ call permut(symetr)
+! write (iout,*) "after permut"
+! call flush(iout)
+ print *,'MAIN: nnt=',nnt,' nct=',nct
+
+ DO I=1,NCUT
+ PRINTANG(I)=.FALSE.
+ PRINTPDB(I)=0
+ printmol2(i)=0
+ IF (RCUTOFF(I).LT.0.0) THEN
+ RCUTOFF(I)=ABS(RCUTOFF(I))
+ PRINTANG(I)=.TRUE.
+ PRINTPDB(I)=outpdb
+ printmol2(i)=outmol2
+ ENDIF
+ ENDDO
+ write (iout,*) 'Number of cutoffs:',NCUT
+ write (iout,*) 'Cutoff values:'
+ DO ICUT=1,NCUT
+ WRITE(IOUT,'(8HRCUTOFF(,I2,2H)=,F8.1,2i2)')ICUT,RCUTOFF(ICUT),&
+ printpdb(icut),printmol2(icut)
+ ENDDO
+ DO I=1,NRES-3
+ MULT(I)=1
+ ENDDO
+ allocate(list_conf(maxconf))
+ do i=1,maxconf
+ list_conf(i)=i
+ enddo
+ call read_coords(ncon,*20)
+
+ allocate(list_conf_(maxconf))
+ do i=1,maxconf
+ list_conf_(i)=list_conf(i)
+ enddo
+ deallocate(list_conf)
+ allocate(list_conf(ncon))
+ do i=1,ncon
+ list_conf(i)=list_conf_(i)
+ enddo
+ deallocate(list_conf_)
+
+!el call alloc_clust_arrays(ncon)
+
+ write (iout,*) 'from read_coords: ncon',ncon
+
+ write (iout,*) "nT",nT
+ do iT=1,nT
+ write (iout,*) "iT",iT
+#ifdef MPI
+ call work_partition(.true.,ncon)
+#endif
+!elwrite(iout,*)"after work partition, ncon_work=", ncon_work,ncon
+
+ call probabl(iT,ncon_work,ncon,*20)
+
+!elwrite(iout,*)"after probabl, ncon_work=", ncon_work,ncon
+
+ if (ncon_work.lt.2) then
+ write (iout,*) "Too few conformations; clustering skipped"
+ exit
+ endif
+#ifdef MPI
+ ndis=ncon_work*(ncon_work-1)/2
+ call work_partition(.true.,ndis)
+#endif
+!el call alloc_clust_arrays(ncon_work)
+ allocate(ICC(ncon_work))
+ allocate(DISS(maxdist))
+
+ DO I=1,NCON_work
+ ICC(I)=I
+ ENDDO
+ WRITE (iout,'(A80)') TITEL
+ t1=tcpu()
+!
+! CALCULATE DISTANCES
+!
+ call daread_ccoords(1,ncon_work)
+ ind1=0
+ DO I=1,NCON_work-1
+ if (mod(i,100).eq.0) print *,'Calculating RMS i=',i
+ do k=1,2*nres
+ do l=1,3
+ c(l,k)=allcart(l,k,i)
+ enddo
+ enddo
+ kkk=1
+ do k=1,nres
+ do l=1,3
+ cref(l,k,kkk)=c(l,k)
+ enddo
+ enddo
+ DO J=I+1,NCON_work
+ IND=IOFFSET(NCON_work,I,J)
+#ifdef MPI
+ if (ind.ge.indstart(me) .and. ind.le.indend(me)) then
+#endif
+ ind1=ind1+1
+ DISS(IND1)=DIFCONF(I,J)
+! write (iout,'(2i4,i10,f10.5)') i,j,ind,DISS(IND)
+#ifdef MPI
+ endif
+#endif
+ ENDDO
+ ENDDO
+ t2=tcpu()
+ WRITE (iout,'(/a,1pe14.5,a/)') &
+ 'Time for distance calculation:',T2-T1,' sec.'
+ t1=tcpu()
+ PRINT '(a)','End of distance computation'
+!el---------------
+ allocate(diss_(maxdist))
+ allocate(scount_(0:nprocs))
+
+ do i=1,maxdist
+ diss_(i)=diss(i)
+ enddo
+ do i=0,nprocs
+ scount_(i)=scount(i)
+ enddo
+!el-----------
+#ifdef MPI
+ call MPI_Gatherv(diss_(1),scount_(me),MPI_REAL,diss(1),&
+ scount(0),idispl(0),MPI_REAL,Master,MPI_COMM_WORLD, IERROR)
+ if (me.eq.master) then
+#endif
+ deallocate(diss_)
+ deallocate(scount_)
+
+ open(80,file='/tmp/distance',form='unformatted')
+ do i=1,ndis
+ write(80) diss(i)
+ enddo
+ if (punch_dist) then
+ do i=1,ncon_work-1
+ do j=i+1,ncon_work
+ IND=IOFFSET(NCON,I,J)
+ write (jrms,'(2i5,2f10.5)') i,j,diss(IND),&
+ energy(j)-energy(i)
+ enddo
+ enddo
+ endif
+!
+! Print out the RMS deviation matrix.
+!
+ if (print_dist) CALL DISTOUT(NCON_work)
+!
+! call hierarchical clustering HC from F. Murtagh
+!
+ N=NCON_work
+ LEN = (N*(N-1))/2
+ write(iout,*) "-------------------------------------------"
+ write(iout,*) "HIERARCHICAL CLUSTERING using"
+ if (iopt.eq.1) then
+ write(iout,*) "WARD'S MINIMUM VARIANCE METHOD"
+ elseif (iopt.eq.2) then
+ write(iout,*) "SINGLE LINK METHOD"
+ elseif (iopt.eq.3) then
+ write(iout,*) "COMPLETE LINK METHOD"
+ elseif (iopt.eq.4) then
+ write(iout,*) "AVERAGE LINK (OR GROUP AVERAGE) METHOD"
+ elseif (iopt.eq.5) then
+ write(iout,*) "MCQUITTY'S METHOD"
+ elseif (iopt.eq.6) then
+ write(iout,*) "MEDIAN (GOWER'S) METHOD"
+ elseif (iopt.eq.7) then
+ write(iout,*) "CENTROID METHOD"
+ else
+ write(iout,*) "IOPT=",iopt," IS INVALID, use 1-7"
+ write(*,*) "IOPT=",iopt," IS INVALID, use 1-7"
+ stop
+ endif
+ write(iout,*)
+ write(iout,*) "hc.f by F. Murtagh, ESA/ESO/STECF, Garching"
+ write(iout,*) "February 1986"
+ write(iout,*) "References:"
+ write(iout,*) "1. Multidimensional clustering algorithms"
+ write(iout,*) " Fionn Murtagh"
+ write(iout,*) " Vienna : Physica-Verlag, 1985."
+ write(iout,*) "2. Multivariate data analysis"
+ write(iout,*) " Fionn Murtagh and Andre Heck"
+ write(iout,*) " Kluwer Academic Publishers, 1987"
+ write(iout,*) "-------------------------------------------"
+ write(iout,*)
+
+#ifdef DEBUG
+ write (iout,*) "The TOTFREE array"
+ do i=1,ncon_work
+ write (iout,'(2i5,f10.5)') i,list_conf(i),totfree(i)
+ enddo
+#endif
+ allocate(CRIT(N),MEMBR(N)) !(maxconf)
+ allocate(CRITVAL(N-1)) !(maxconf-1)
+ allocate(IA(N),IB(N))
+ allocate(ICLASS(N,N-1)) !(maxconf,maxconf-1)
+ allocate(HVALS(N-1)) !(maxconf-1)
+ allocate(IORDER(N-1),HEIGHT(N-1)) !(maxconf-1)
+ allocate(nn(N)) !(maxconf)
+ allocate(DISNN(N)) !(maxconf)
+ allocate(FLAG(N)) !(maxconf)
+
+ call flush(iout)
+ CALL HC(N,M,LEN,IOPT,IA,IB,CRIT,MEMBR,NN,DISNN,FLAG,DISS)
+ LEV = N-1
+ write (iout,*) "n",n," ncon_work",ncon_work," lev",lev
+ if (lev.lt.2) then
+ write (iout,*) "Too few conformations to cluster."
+ goto 192
+ endif
+ CALL HCASS(N,IA,IB,CRIT,LEV,ICLASS,HVALS,IORDER,CRITVAL,HEIGHT)
+! CALL HCDEN(LEV,IORDER,HEIGHT,CRITVAL)
+
+ allocate(licz(maxgr))
+ allocate(iass(maxgr))
+ allocate(nconf(maxgr,maxingr))
+ allocate(totfree_gr(maxgr))
+
+ do i=1,maxgr
+ licz(i)=0
+ enddo
+ icut=1
+ i=1
+ NGR=i+1
+ do j=1,n
+ licz(iclass(j,i))=licz(iclass(j,i))+1
+ nconf(iclass(j,i),licz(iclass(j,i)))=j
+! write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),
+! & nconf(iclass(j,i),licz(iclass(j,i)))
+ enddo
+ do i=1,lev-1
+
+ idum=lev-i
+ DO L=1,LEV
+ IF (HEIGHT(L).EQ.IDUM) GOTO 190
+ ENDDO
+ 190 IDUM=L
+ write(IOUT,*) "i+1",i+1," idum",idum," critval",CRITVAL(IDUM),&
+ " icut",icut," cutoff",rcutoff(icut)
+ IF (CRITVAL(IDUM).LT. RCUTOFF(ICUT)) THEN
+ WRITE (iout,'(/a,f10.5)') 'AT CUTOFF:',rcutoff(icut)
+ write (iout,'(a,f8.2)') 'Maximum distance found:',&
+ CRITVAL(IDUM)
+ CALL SRTCLUST(ICUT,ncon_work,iT)
+ CALL TRACK(ICUT)
+ CALL WRTCLUST(ncon_work,ICUT,PRINTANG,PRINTPDB,PRINTMOL2,iT)
+ icut=icut+1
+ if (icut.gt.ncut) goto 191
+ ENDIF
+ NGR=i+1
+ do l=1,maxgr
+ licz(l)=0
+ enddo
+ do j=1,n
+ enddo
+ do j=1,n
+ licz(iclass(j,i))=licz(iclass(j,i))+1
+ nconf(iclass(j,i),licz(iclass(j,i)))=j
+!d write (iout,*) i,j,iclass(j,i),licz(iclass(j,i)),&
+!d nconf(iclass(j,i),licz(iclass(j,i)))
+!d print *,j,iclass(j,i),
+!d & licz(iclass(j,i)),nconf(iclass(j,i),licz(iclass(j,i)))
+ enddo
+ enddo
+ 191 continue
+!
+ if (plot_tree) then
+ CALL WRITRACK
+ CALL PLOTREE
+ endif
+!
+ t2=tcpu()
+ WRITE (iout,'(/a,1pe14.5,a/)') &
+ 'Total time for clustering:',T2-T1,' sec.'
+#ifdef MPI
+ endif
+#endif
+ 192 continue
+ enddo
+!
+ close(icbase,status="delete")
+#ifdef MPI
+!el call MPI_Finalize(MPI_COMM_WORLD,IERROR)
+ call MPI_Finalize(IERROR)
+#endif
+ stop '********** Program terminated normally.'
+ 20 write (iout,*) "Error reading coordinates"
+#ifdef MPI
+!el call MPI_Finalize(MPI_COMM_WORLD,IERROR)
+ call MPI_Finalize(IERROR)
+#endif
+ stop
+ 30 write (iout,*) "Error reading reference structure"
+#ifdef MPI
+!el call MPI_Finalize(MPI_COMM_WORLD,IERROR)
+ call MPI_Finalize(IERROR)
+#endif
+ stop
+ end program cluster
+!---------------------------------------------------------------------------
+!
+!---------------------------------------------------------------------------
+ real(kind=8) function difconf(icon,jcon)
+
+ use clust_data
+
+ use io_units, only: iout
+ use io_base, only: permut
+ use geometry_data, only: nres,c,cref,tabperm
+ use energy_data, only: nct,nnt
+ use control_data, only: symetr,lside,nend,nstart
+ use regularize_, only: fitsq
+ implicit none
+! include 'DIMENSIONS'
+! include 'sizesclu.dat'
+! include 'COMMON.CONTROL'
+! include 'COMMON.CLUSTER'
+! include 'COMMON.CHAIN'
+! include 'COMMON.INTERACT'
+! include 'COMMON.VAR'
+! include 'COMMON.IOUNITS'
+ logical :: non_conv
+ real(kind=8) :: przes(3),obrot(3,3)
+ real(kind=8) :: xx(3,2*nres),yy(3,2*nres) !(3,maxres2)
+ integer :: i,ii,j,icon,jcon,kkk,nperm,chalen,zzz
+ integer :: iaperm,ibezperm,run
+ real(kind=8) :: rms,rmsmina
+! write (iout,*) "tu dochodze"
+ rmsmina=10d10
+ nperm=1
+ do i=1,symetr
+ nperm=i*nperm
+ enddo
+! write (iout,*) "nperm",nperm
+ call permut(symetr)
+! write (iout,*) "tabperm", tabperm(1,1)
+ do kkk=1,nperm
+ if (lside) then
+ ii=0
+ chalen=int((nend-nstart+2)/symetr)
+ do run=1,symetr
+ do i=nstart,(nstart+chalen-1)
+ zzz=tabperm(kkk,run)
+! write (iout,*) "tutaj",zzz
+ ii=ii+1
+ iaperm=(zzz-1)*chalen+i
+ ibezperm=(run-1)*chalen+i
+ do j=1,3
+ xx(j,ii)=allcart(j,iaperm,jcon)
+ yy(j,ii)=cref(j,ibezperm,kkk)
+ enddo
+ enddo
+ enddo
+ do run=1,symetr
+ do i=nstart,(nstart+chalen-1)
+ zzz=tabperm(kkk,run)
+ ii=ii+1
+ iaperm=(zzz-1)*chalen+i
+ ibezperm=(run-1)*chalen+i
+! if (itype(i).ne.10) then
+ ii=ii+1
+ do j=1,3
+ xx(j,ii)=allcart(j,iaperm+nres,jcon)
+ yy(j,ii)=cref(j,ibezperm+nres,kkk)
+ enddo
+ enddo
+! endif
+ enddo
+ call fitsq(rms,xx(1,1),yy(1,1),ii,przes,obrot,non_conv)
+ else
+ chalen=int((nct-nnt+2)/symetr)
+ do run=1,symetr
+ do i=nnt,(nnt+chalen-1)
+ zzz=tabperm(kkk,run)
+! write (iout,*) "tu szukaj", zzz,run,kkk
+ iaperm=(zzz-1)*chalen+i
+ ibezperm=(run-1)*chalen+i
+! do i=nnt,nct
+ do j=1,3
+ c(j,i)=allcart(j,iaperm,jcon)
+ enddo
+ enddo
+ enddo
+ call fitsq(rms,c(1,nstart),cref(1,nstart,kkk),nend-nstart+1,&
+ przes,&
+ obrot,non_conv)
+ endif
+ if (rms.lt.0.0) then
+ print *,'error, rms^2 = ',rms,icon,jcon
+ stop
+ endif
+ if (non_conv) print *,non_conv,icon,jcon
+ if (rmsmina.gt.rms) rmsmina=rms
+ enddo
+ difconf=dsqrt(rmsmina)
+ return
+ end function difconf
+!------------------------------------------------------------------------------
+ subroutine distout(ncon)
+
+ use clust_data
+ use hc_, only:ioffset
+ use io_units, only: iout
+ implicit none
+! include 'DIMENSIONS'
+! include 'sizesclu.dat'
+ integer :: ncon
+ integer,parameter :: ncol=10
+! include 'COMMON.IOUNITS'
+! include 'COMMON.CLUSTER'
+ integer :: i,j,k,jlim,jlim1,nlim,ind
+ real(kind=4) :: b(ncol)
+
+ write (iout,'(a)') 'The distance matrix'
+ do 1 i=1,ncon,ncol
+ nlim=min0(i+ncol-1,ncon)
+ write (iout,1000) (k,k=i,nlim)
+ write (iout,'(8h--------,10a)') ('-------',k=i,nlim)
+ 1000 format (/8x,10(i4,3x))
+ 1020 format (/1x,80(1h-)/)
+ do 2 j=i,ncon
+ jlim=min0(j,nlim)
+ if (jlim.eq.j) then
+ b(jlim-i+1)=0.0d0
+ jlim1=jlim-1
+ else
+ jlim1=jlim
+ endif
+ do 3 k=i,jlim1
+ if (j.lt.k) then
+ IND=IOFFSET(NCON,j,k)
+ else
+ IND=IOFFSET(NCON,k,j)
+ endif
+ 3 b(k-i+1)=diss(IND)
+ write (iout,1010) j,(b(k),k=1,jlim-i+1)
+ 2 continue
+ 1 continue
+ 1010 format (i5,3x,10(f6.2,1x))
+ return
+ end subroutine distout
+!------------------------------------------------------------------------------
+! srtclust.f
+!------------------------------------------------------------------------------
+ SUBROUTINE SRTCLUST(ICUT,NCON,IB)
+
+ use clust_data
+ use io_units, only: iout
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'sizesclu.dat'
+! include 'COMMON.CLUSTER'
+! include 'COMMON.FREE'
+! include 'COMMON.IOUNITS'
+ implicit none
+ real(kind=8),dimension(:),allocatable :: prob !(maxgr)
+ real(kind=8) :: emin,ene,en1,sumprob
+ integer :: igr,i,ii,li1,li2,ligr,ico,jco,ind1,ind2
+ integer :: jgr,li,nco,ib,ncon,icut
+!
+! Compute free energies of clusters
+!
+ allocate(prob(maxgr))
+
+ do igr=1,ngr
+ emin=totfree(nconf(igr,1))
+ totfree_gr(igr)=1.0d0
+ do i=2,licz(igr)
+ ii=nconf(igr,i)
+ totfree_gr(igr)=totfree_gr(igr)+dexp(-totfree(ii)+emin)
+ enddo
+! write (iout,*) "igr",igr," totfree",emin,
+! & " totfree_gr",totfree_gr(igr)
+ totfree_gr(igr)=emin-dlog(totfree_gr(igr))
+! write (iout,*) igr," efree",totfree_gr(igr)/beta_h(ib)
+ enddo
+!
+! SORT CONFORMATIONS IN GROUPS ACC. TO ENERGY
+!
+ DO 16 IGR=1,NGR
+ LIGR=LICZ(IGR)
+ DO 17 ICO=1,LIGR-1
+ IND1=NCONF(IGR,ICO)
+ ENE=totfree(IND1)
+ DO 18 JCO=ICO+1,LIGR
+ IND2=NCONF(IGR,JCO)
+ EN1=totfree(IND2)
+ IF (EN1.LT.ENE) THEN
+ NCONF(IGR,ICO)=IND2
+ NCONF(IGR,JCO)=IND1
+ IND1=IND2
+ ENE=EN1
+ ENDIF
+ 18 CONTINUE
+ 17 CONTINUE
+ 16 CONTINUE
+!
+! SORT GROUPS
+!
+ DO 71 IGR=1,NGR
+ ENE=totfree_gr(IGR)
+ DO 72 JGR=IGR+1,NGR
+ EN1=totfree_gr(JGR)
+ IF (EN1.LT.ENE) THEN
+ LI1=LICZ(IGR)
+ LI2=LICZ(JGR)
+ LI=MAX0(LI1,LI2)
+ DO 73 I=1,LI
+ NCO=NCONF(IGR,I)
+ NCONF(IGR,I)=NCONF(JGR,I)
+ NCONF(JGR,I)=NCO
+ 73 CONTINUE
+ totfree_gr(igr)=en1
+ totfree_gr(jgr)=ene
+ ENE=EN1
+ LICZ(IGR)=LI2
+ LICZ(JGR)=LI1
+ ENDIF
+ 72 CONTINUE
+ 71 CONTINUE
+ write (iout,'("Free energies and probabilities of clusters at",f6.1," K")')&
+ 1.0d0/(1.987d-3*beta_h(ib)) !'
+ prob(1)=1.0d0
+ sumprob=1.0d0
+ do i=2,ngr
+ prob(i)=dexp(-(totfree_gr(i)-totfree_gr(1)))
+ sumprob=sumprob+prob(i)
+ enddo
+ do i=1,ngr
+ prob(i)=prob(i)/sumprob
+ enddo
+ sumprob=0.0d0
+ write (iout,'("clust efree prob sumprob")')
+ do i=1,ngr
+ sumprob=sumprob+prob(i)
+ write (iout,'(i5,f8.1,2f8.5)') i,totfree_gr(i)/beta_h(ib),&
+ prob(i),sumprob
+ enddo
+ DO 81 IGR=1,NGR
+ LI=LICZ(IGR)
+ DO 82 I=1,LI
+ 82 IASS(NCONF(IGR,I))=IGR
+ 81 CONTINUE
+ if (lgrp) then
+ do i=1,ncon
+ iass_tot(i,icut)=iass(i)
+! write (iout,*) icut,i,iass(i),iass_tot(i,icut)
+ enddo
+ endif
+ RETURN
+ END SUBROUTINE SRTCLUST
+!------------------------------------------------------------------------------
+!------------------------------------------------------------------------------