rename
[unres4.git] / source / unres / CSA.F90
diff --git a/source/unres/CSA.F90 b/source/unres/CSA.F90
new file mode 100644 (file)
index 0000000..66b98ee
--- /dev/null
@@ -0,0 +1,5321 @@
+      module csa
+!-----------------------------------------------------------------------------
+      use io_units
+      use names
+      use math
+      use random
+      use geometry_data, only: nres,rad2deg
+      use geometry
+      use energy
+      use MPI_
+      use csa_data
+      use compare
+      use io_config
+
+      implicit none
+!-----------------------------------------------------------------------------
+! commom.bank
+!      common/varin/
+!      real(kind=8),dimension(:,:,:,:),allocatable :: dihang_in !(mxang,maxres,mxch,mxio)
+      integer,dimension(:),allocatable :: nss_in !(mxio)
+      integer,dimension(:,:),allocatable :: iss_in,jss_in !(maxss,mxio)
+!      common/minvar/
+      real(kind=8),dimension(:,:,:,:),allocatable :: dihang !(mxang,maxres,mxch,mxio)
+      real(kind=8),dimension(:),allocatable :: etot!,rmsn,pncn !(mxio)
+      integer,dimension(:),allocatable :: nss_out !(mxio)
+      integer,dimension(:,:),allocatable ::iss_out,jss_out !(maxss,mxio)
+!      common/bank/
+!      real(kind=8),dimension(:,:,:,:),allocatable :: bvar !(mxang,maxres,mxch,mxio)
+!      real(kind=8),dimension(:),allocatable :: bene,rene,&
+!       brmsn,rrmsn,bpncn,rpncn !(mxio)
+      integer,dimension(:),allocatable :: is,jbank !(mxio)
+      real(kind=8) :: avedif,difmin,ebmin,ebmax,ebmaxt!,&
+!       dele,difcut,cutdif,rmscut,pnccut
+      real(kind=8),dimension(:,:),allocatable :: dij !(mxio,mxio)
+!      common/bank_disulfid/               
+!      common/mvstat/
+      integer,dimension(:),allocatable :: movenx,movernx !(mxio)
+      integer,dimension(:,:),allocatable :: nstatnx,nstatnx_tot !(0:mxmv,3)
+      integer,dimension(:,:),allocatable :: indb !(mxio,9)
+      integer,dimension(:,:),allocatable :: parent !(3,mxio)
+!      common/send2/
+      integer,dimension(:),allocatable :: isend2 !(mxio)
+      integer,dimension(:,:),allocatable :: iff_in !(maxres,mxio2)
+      integer,dimension(:,:,:,:),allocatable :: dihang_in2 !(mxang,maxres,mxch,mxio2)
+      integer,dimension(:,:),allocatable :: idata !(5,mxio)
+!-----------------------------------------------------------------------------
+! common.csa
+!      integer :: irestart,ndiff
+!      common/alphaa/
+      integer,dimension(:),allocatable :: ngroup !(mxgr)
+      integer,dimension(:,:,:),allocatable :: igroup !(3,mxang,mxgr)
+      integer :: ntotgr!,numch
+!      common/csa_input/
+!      common/dih_control/
+!      real(kind=8) :: rdih_bias
+      logical :: ldih_bias
+!-----------------------------------------------------------------------------
+! common.distfit
+!      COMMON /frag/
+      integer,dimension(:,:),allocatable :: bvar_frag !(mxio,6)
+      integer,dimension(:,:),allocatable :: hvar_frag,lvar_frag,svar_frag !(mxio,3)
+      integer,dimension(:,:),allocatable :: avar_frag !(mxio,5)
+!-----------------------------------------------------------------------------
+! commom.hairpin
+!      common /spinka/
+      integer :: nharp_tot
+      integer,dimension(:),allocatable :: nharp_seed,nharp_use !(max_seed)
+      integer,dimension(:,:,:),allocatable :: iharp_seed       !(4,maxres/3,max_seed)
+      integer,dimension(:,:,:),allocatable :: iharp_use                !(0:4,maxres/3,max_seed)
+!-----------------------------------------------------------------------------
+! Maximum number of moves (n1-n8)
+      integer,parameter :: mxmv=18
+!-----------------------------------------------------------------------------
+!
+!
+!-----------------------------------------------------------------------------
+      contains
+!-----------------------------------------------------------------------------
+! bank.F
+!-----------------------------------------------------------------------------
+      subroutine refresh_bank(ntrial)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+      include 'mpif.h'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.VAR'
+!      include 'COMMON.CONTROL'
+      character :: chacc
+      integer :: iaccn,ntrial
+      real(kind=8) :: l_diff(mxio),denep
+      integer :: i,j,n,m,i1,idmin
+      real(kind=8) :: del_ene
+
+      do i=0,mxmv
+        do j=1,3
+          nstatnx_tot(i,j)=nstatnx_tot(i,j)+nstatnx(i,j)
+          nstatnx(i,j)=0
+        enddo
+      enddo
+
+! loop over all newly obtained conformations
+      do n=1,ntrial
+       chacc=' '
+       iaccn=0
+       nstatnx(movernx(n),1)=nstatnx(movernx(n),1)+1
+!ccccccccccccccccccccccccccccccccccccccccccc
+!jlee
+       if(iref.ne.0) then
+        if(rmsn(n).gt.rmscut.or.pncn(n).lt.pnccut) goto 100
+       endif
+!jlee
+       if(etot(n).gt.ebmax) goto 100
+! Find the conformation closest to the conformation n in the bank
+       difmin=9.d9
+       do m=1,nbank
+        call get_diff12(dihang(1,1,1,n),bvar(1,1,1,m),l_diff(m))
+        if(l_diff(m).lt.difmin) then
+         difmin=l_diff(m)
+         idmin=m
+        endif
+       enddo
+
+       if(difmin.lt.cutdif) then
+! n is redundant to idmin
+        if(etot(n).lt.bene(idmin)) then
+         if(etot(n).lt.bene(idmin)-0.01d0) then
+          ibank(idmin)=0
+          jbank(idmin)=0
+         endif
+         denep=bene(idmin)-etot(n)
+         call replace_bvar(idmin,n)
+!rc Update dij
+         do i1=1,nbank
+           if (i1.ne.idmin) then
+            dij(i1,idmin)=l_diff(i1)
+            dij(idmin,i1)=l_diff(i1)
+           endif
+         enddo
+         chacc='c'
+         iaccn=idmin
+         nstatnx(movernx(n),2)=nstatnx(movernx(n),2)+1
+         if(idmin.eq.ibmax) call find_max
+        endif
+       else
+! got new conformation
+        del_ene=0.0d0
+        if(ebmax-ebmin.gt.del_ene) then
+         denep=ebmax-etot(n)
+         call replace_bvar(ibmax,n)
+!rc Update dij
+         do i1=1,nbank
+           if (i1.ne.ibmax) then
+            dij(i1,ibmax)=l_diff(i1)
+            dij(ibmax,i1)=l_diff(i1)
+           endif
+         enddo
+         chacc='f'
+         iaccn=ibmax
+         nstatnx(movernx(n),3)=nstatnx(movernx(n),3)+1
+         ibank(ibmax)=0
+         jbank(ibmax)=0
+         call find_max
+        else
+         if(del_ene.lt.0.0001) then
+          write (iout,*) 'ERROR in refresh_bank: '
+          write (iout,*) 'ebmax: ',ebmax
+          write (iout,*) 'ebmin: ',ebmin
+          write (iout,*) 'del_ene: ',del_ene
+!rc          call mpi_abort(mpi_comm_world,ierror,ierrcode)
+         endif
+!jp nbmax is never defined so condition below is always false
+!         if(nbank.lt.nbmax) then
+!          nbank=nbank+1
+!          call replace_bvar(nbank,n)
+!          ibank(nbank)=0
+!          jbank(nbank)=0
+!         else
+          call replace_bvar(ibmax,n)
+          ibank(ibmax)=0
+          jbank(ibmax)=0
+          call find_max
+!         endif
+        endif
+       endif
+!ccccccccccccccccccccccccccccccccccccccccccc
+  100 continue
+       if (iaccn.eq.0) then
+        if (iref.eq.0) then 
+         write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5)') &
+          indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ',&
+          indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9)
+        else
+      write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5,a5,0pf4.1,a5,f3.0)') &
+          indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ',&
+          indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9),&
+          ' rms ',rmsn(n),' %NC ',pncn(n)*100
+        endif
+       else
+        if (iref.eq.0) then
+        write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5,1x,a1,i4,0pf8.1,0pf8.1)') &
+          indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ',&
+          indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9),&
+          chacc,iaccn,difmin,denep
+        else
+         write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5,a5,0pf4.1,a5,f3.0,1x,a1,i4,0pf8.1,0pf8.1)') &
+          indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ',&
+          indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9),&
+          ' rms ',rmsn(n),' %NC ',pncn(n)*100,&
+           chacc,iaccn,difmin,denep
+        endif
+       endif
+      enddo
+! end of loop over all newly obtained conformations
+      do i=0,mxmv
+        if(nstatnx(i,1).ne.0) then
+         if (i.le.9) then
+         write(iout,'(a4,i1,a7,i4,a7,i4,a5,i4,a5,f5.1)') &
+                '## N',i,' total=',nstatnx(i,1),&
+                ' close=',nstatnx(i,2),' far=',nstatnx(i,3),&
+                ' %acc',(nstatnx(i,2)+nstatnx(i,3))*100.0/nstatnx(i,1)
+         else
+         write(iout,'(a3,i2,a7,i4,a7,i4,a5,i4,a5,f5.1)') &
+                '##N',i,' total=',nstatnx(i,1),&
+                ' close=',nstatnx(i,2),' far=',nstatnx(i,3),&
+                ' %acc',(nstatnx(i,2)+nstatnx(i,3))*100.0/nstatnx(i,1)
+         endif
+        else
+         if (i.le.9) then        
+         write(iout,'(a4,i1,a7,i4,a7,i4,a5,i4,a5,f5.1)') &
+                '## N',i,' total=',nstatnx(i,1),&
+                ' close=',nstatnx(i,2),' far=',nstatnx(i,3),&
+                ' %acc',0.0
+         else
+         write(iout,'(a3,i2,a7,i4,a7,i4,a5,i4,a5,f5.1)') &
+                '##N',i,' total=',nstatnx(i,1),&
+                ' close=',nstatnx(i,2),' far=',nstatnx(i,3),&
+                ' %acc',0.0
+         endif
+        endif
+      enddo
+      call flush(iout)
+!rc Update dij
+!rc moved up, saves some get_diff12 calls 
+!rc
+!rc      do i1=1,nbank-1
+!rc       do i2=i1+1,nbank
+!rc        if(jbank(i1).eq.0.or.jbank(i2).eq.0) then
+!rc         call get_diff12(bvar(1,1,1,i1),bvar(1,1,1,i2),diff)
+!rc         dij(i1,i2)=diff
+!rc         dij(i2,i1)=diff
+!rc        endif
+!rc       enddo
+!rc      enddo
+
+      do i=1,nbank
+       jbank(i)=1
+      enddo
+
+      return
+      end subroutine refresh_bank
+!-----------------------------------------------------------------------------
+      subroutine replace_bvar(iold,inew)
+
+      use control_data, only: vdisulf
+      use energy_data, only: ns,iss
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+      include 'mpif.h'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.CONTROL'
+!      include 'COMMON.SBRIDGE'
+      integer :: iold,inew,ierror,ierrcode,i,j,k
+
+      if (iold.gt.mxio .or. iold.lt.1 .or. inew.gt.mxio .or. inew.lt.1) &
+        then
+        write (iout,*) 'Dimension ERROR in REPLACE_BVAR: IOLD',iold,&
+        ' INEW',inew
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         bvar(i,j,k,iold)=dihang(i,j,k,inew)
+        enddo
+       enddo
+      enddo
+      bene(iold)=etot(inew)
+      brmsn(iold)=rmsn(inew)
+      bpncn(iold)=pncn(inew)
+
+      if(bene(iold).lt.ebmin) then
+        ebmin=bene(iold)
+        ibmin=iold
+      endif
+
+      if(vdisulf) then
+        bvar_nss(iold)=nss_out(inew)
+!d        write(iout,*) 'SS BANK',iold,bvar_nss(iold)
+        do i=1,bvar_nss(iold)
+          bvar_ss(1,i,iold)=iss_out(i,inew)
+          bvar_ss(2,i,iold)=jss_out(i,inew)
+!d          write(iout,*) 'SS',bvar_ss(1,i,iold)-nres,
+!d     &          bvar_ss(2,i,iold)-nres
+        enddo
+
+       bvar_ns(iold)=ns-2*bvar_nss(iold)
+!d        write(iout,*) 'CYS #free ', bvar_ns(iold)
+          k=0
+          do i=1,ns
+            j=1
+            do while( iss(i).ne.iss_out(j,inew)-nres .and. &
+                       iss(i).ne.jss_out(j,inew)-nres .and. &
+                       j.le.nss_out(inew))
+               j=j+1 
+            enddo
+            if (j.gt.nss_out(inew)) then            
+              k=k+1   
+               bvar_s(k,iold)=iss(i)
+             endif
+           enddo
+!d         write(iout,*) 'CYS free',(bvar_s(k,iold),k=1,bvar_ns(iold))
+      endif
+
+      return
+      end subroutine replace_bvar
+!-----------------------------------------------------------------------------
+      subroutine save_is(ind)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+      include 'mpif.h'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+      integer :: ind,i,j,k,index,ierror,ierrcode
+
+      index=nbank+ind
+!     print *, "nbank,ind,index,is(ind) ",nbank,ind,index,is(ind)
+      if (index.gt.mxio .or. index.lt.1 .or. &
+        is(ind).gt.mxio .or. is(ind).lt.1) then
+        write (iout,*) 'Dimension ERROR in SAVE_IS: INDEX',index,&
+        ' IND',ind,' IS',is(ind)
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         bvar(i,j,k,index)=bvar(i,j,k,is(ind))
+        enddo
+       enddo
+      enddo
+      bene(index)=bene(is(ind))
+      ibank(is(ind))=1
+
+      return
+      end subroutine save_is
+!-----------------------------------------------------------------------------
+      subroutine select_is(n,ifar,idum)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer,dimension(mxio) :: itag
+      real(kind=8),dimension(mxio) :: adiff
+      integer :: n,ifar,idum,i,iusesv,imade
+
+      iuse=0
+      do i=1,nbank
+       if(ibank(i).eq.0) then
+        iuse=iuse+1
+        itag(iuse)=i
+       endif
+      enddo
+      iusesv=iuse
+
+      if(iuse.eq.0) then
+       icycle=icycle+1
+       do i=1,nbank
+        if(ibank(i).eq.2) then
+         ibank(i)=1
+        else
+         ibank(i)=0
+        endif
+       enddo
+       imade=0
+       call get_is(idum,ifar,n,imade,0)
+!test3       call get_is_max(idum,ifar,n,imade,0)
+      else if(iuse.eq.n) then
+       do i=1,iuse
+        is(i)=itag(i)
+        call save_is(i)
+       enddo
+      else if(iuse.lt.n) then
+!      if(icycle.eq.0) then
+!       do i=1,n
+!        ind=mod(i-1,iuse)+1
+!        is(i)=itag(ind)
+!        call save_is(i)
+!       enddo
+!      else
+!      endif
+       do i=1,iuse
+        is(i)=itag(i)
+        call save_is(i)
+       enddo
+       imade=iuse
+!      call get_is_ran(idum,n,imade,1)
+       call get_is(idum,ifar,n,imade,1)
+!test3       call get_is_max(idum,ifar,n,imade,1)
+!      if(iusesv.le.n/10) then
+       if(iusesv.le.0) then
+        icycle=icycle+1
+        do i=1,nbank
+!        if(ibank(i).eq.2) then
+!         ibank(i)=1
+         if(ibank(i).ge.2) then
+          ibank(i)=ibank(i)-1
+         else
+          ibank(i)=0
+         endif
+        enddo
+       endif
+      else
+       imade=0
+       call get_is(idum,ifar,n,imade,0)
+!test3       call get_is_max(idum,ifar,n,imade,0)
+      endif
+      iuse=iusesv
+
+      return
+      end subroutine select_is
+!-----------------------------------------------------------------------------
+      subroutine get_is_ran(idum,n,imade,k)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      real(kind=4) :: ran1,ran2
+      integer,dimension(mxio) :: itag
+      real(kind=8),dimension(mxio) :: adiff
+      integer :: idum,n,imade,k,j,i,iran
+
+      do j=imade+1,n
+       iuse=0
+       do i=1,nbank
+        if(ibank(i).eq.k) then
+         iuse=iuse+1
+         itag(iuse)=i
+        endif
+       enddo
+       iran=iuse*  ran1(idum)+1
+       is(j)=itag(iran)
+       call save_is(j)
+      enddo
+
+      return
+      end subroutine get_is_ran
+!-----------------------------------------------------------------------------
+      subroutine get_is(idum,ifar,n,imade,k)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      real(kind=4) :: ran1,ran2
+      integer,dimension(mxio) :: itag
+      real(kind=8),dimension(mxio) :: adiff
+      integer :: idum,ifar,n,imade,k,i,iran
+
+      iuse=0
+      do i=1,nbank
+       if(ibank(i).eq.k) then
+        iuse=iuse+1
+        itag(iuse)=i
+       endif
+      enddo
+      iran=iuse*  ran1(idum)+1
+      imade=imade+1
+      is(imade)=itag(iran)
+      call save_is(imade)
+
+      do i=imade+1,ifar-1
+       if(icycle.eq.-1) then
+        call select_iseed_max(i,k)
+       else
+        call select_iseed_min(i,k)
+!test4  call select_iseed_max(i,k)
+       endif
+       call save_is(i)
+      enddo
+
+      do i=ifar,n
+       call select_iseed_far(i,k)
+       call save_is(i)
+      enddo
+
+      return
+      end subroutine get_is
+!-----------------------------------------------------------------------------
+      subroutine select_iseed_max(imade1,ik)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer,dimension(mxio) :: itag
+      real(kind=8),dimension(mxio) :: adiff
+      integer :: imade1,ik,i,n,imade,m,itagi
+      real(kind=8) :: difmax,diff,emax,benei,diffmn
+
+      iuse=0
+      avedif=0.d0
+      difmax=0.d0
+      do n=1,nbank
+       if(ibank(n).eq.ik) then
+        iuse=iuse+1
+        diffmn=9.d190
+        do imade=1,imade1-1
+!        m=nbank+imade
+!        call get_diff12(bvar(1,1,1,n),bvar(1,1,1,m),diff,idiff)
+         m=is(imade)
+         diff=dij(n,m)
+         if(diff.lt.diffmn) diffmn=diff
+        enddo
+        if(diffmn.gt.difmax) difmax=diffmn
+        adiff(iuse)=diffmn
+        itag(iuse)=n
+        avedif=avedif+diffmn
+       endif
+      enddo
+
+      avedif=avedif/iuse
+!     avedif=(avedif+difmax)/2
+      emax=-9.d190
+      do i=1,iuse
+       if(adiff(i).ge.avedif) then
+        itagi=itag(i)
+        benei=bene(itagi)
+        if(benei.gt.emax) then
+         emax=benei
+         is(imade1)=itagi  
+        endif
+       endif
+      enddo
+
+      if(ik.eq.0) iuse=iuse-1
+
+      return
+      end subroutine select_iseed_max
+!-----------------------------------------------------------------------------
+      subroutine select_iseed_min(imade1,ik)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer,dimension(mxio) :: itag
+      real(kind=8),dimension(mxio) :: adiff
+      integer :: imade1,ik,n,imade,m,i,itagi
+      real(kind=8) :: difmax,diff,diffmn,emin,benei
+
+      iuse=0
+      avedif=0.d0
+      difmax=0.d0
+      do n=1,nbank
+       if(ibank(n).eq.ik) then
+        iuse=iuse+1
+        diffmn=9.d190
+        do imade=1,imade1-1
+!        m=nbank+imade
+!        call get_diff12(bvar(1,1,1,n),bvar(1,1,1,m),diff,idiff)
+         m=is(imade)
+         diff=dij(n,m)
+         if(diff.lt.diffmn) diffmn=diff
+        enddo
+        if(diffmn.gt.difmax) difmax=diffmn
+        adiff(iuse)=diffmn
+        itag(iuse)=n
+        avedif=avedif+diffmn
+       endif
+      enddo
+
+      avedif=avedif/iuse
+!     avedif=(avedif+difmax)/2
+      emin=9.d190
+      do i=1,iuse
+!      print *,"i, adiff(i),avedif : ",i,adiff(i),avedif
+       if(adiff(i).ge.avedif) then
+        itagi=itag(i)
+        benei=bene(itagi)
+!       print *,"i, benei,emin : ",i,benei,emin
+        if(benei.lt.emin) then
+         emin=benei
+         is(imade1)=itagi  
+        endif
+       endif
+      enddo
+
+      if(ik.eq.0) iuse=iuse-1
+
+!     print *, "exiting select_iseed_min",is(imade1)
+
+      return
+      end subroutine select_iseed_min
+!-----------------------------------------------------------------------------
+      subroutine select_iseed_far(imade1,ik)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer :: imade1,ik,n,imade,m
+      real(kind=8) :: dmax,diffmn,diff
+
+      dmax=-9.d190
+      do n=1,nbank
+       if(ibank(n).eq.ik) then
+        diffmn=9.d190
+        do imade=1,imade1-1
+!        m=nbank+imade
+!        call get_diff12(bvar(1,1,1,n),bvar(1,1,1,m),diff,idiff)
+         m=is(imade)
+         diff=dij(n,m)
+         if(diff.lt.diffmn) diffmn=diff
+        enddo
+       endif
+       if(diffmn.gt.dmax) then
+        dmax=diffmn
+        is(imade1)=n  
+       endif
+      enddo
+
+      return
+      end subroutine select_iseed_far
+!-----------------------------------------------------------------------------
+      subroutine find_min
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer :: i
+      real(kind=8) :: benei
+
+      ebmin=9.d190
+
+      do i=1,nbank
+       benei=bene(i)
+       if(benei.lt.ebmin) then
+        ebmin=benei
+        ibmin=i
+       endif   
+      enddo    
+
+      return
+      end subroutine find_min
+!-----------------------------------------------------------------------------
+      subroutine find_max
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer :: i
+      real(kind=8) :: benei
+
+      ebmax=-9.d190
+
+      do i=1,nbank
+       benei=bene(i)
+       if(benei.gt.ebmax) then
+        ebmax=benei
+        ibmax=i
+       endif
+      enddo
+
+      return
+      end subroutine find_max
+!-----------------------------------------------------------------------------
+      subroutine get_diff
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer :: i,i1,i2
+      real(kind=8) :: tdiff,difmin,diff
+
+      tdiff=0.d0
+      difmin=9.d190
+      do i1=1,nbank-1
+       do i2=i1+1,nbank
+        if(jbank(i1).eq.0.or.jbank(i2).eq.0) then
+         call get_diff12(bvar(1,1,1,i1),bvar(1,1,1,i2),diff)
+         dij(i1,i2)=diff
+         dij(i2,i1)=diff
+        else
+         diff=dij(i1,i2)
+        endif
+        tdiff=tdiff+diff
+        if(diff.lt.difmin) difmin=diff
+       enddo
+       dij(i1,i1)=0.0
+      enddo
+
+      do i=1,nbank
+       jbank(i)=1
+      enddo
+
+      avedif=tdiff/nbank/(nbank-1)*2
+
+      return
+      end subroutine get_diff
+!-----------------------------------------------------------------------------
+      subroutine estimate_cutdif(adif,xct,cutdifr)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer :: nexp
+      real(kind=8) :: adif,xct,cutdifr,ctdif1,exponent
+
+      ctdif1=adif/cut2
+
+      exponent = cutdifr*cut1/adif
+      exponent = dlog(exponent)/dlog(xct)
+
+      nexp=exponent+0.25
+      cutdif= adif/cut1*xct**nexp
+      if(cutdif.lt.ctdif1) cutdif=ctdif1
+
+      return
+      end subroutine estimate_cutdif
+!-----------------------------------------------------------------------------
+      subroutine get_is_max(idum,ifar,n,imade,k)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+      integer :: idum,ifar,n,imade,k,i,j
+      real(kind=8) :: emax
+
+      do i=imade+1,n
+       emax=-9.d190
+       do j=1,nbank
+        if(ibank(j).eq.k .and. bene(j).gt.emax) then
+           emax=bene(j)
+           is(i)=j
+        endif
+       enddo
+       call save_is(i)
+      enddo
+
+      return
+      end subroutine get_is_max
+!-----------------------------------------------------------------------------
+! csa.f
+!-----------------------------------------------------------------------------
+      subroutine make_array
+
+      use energy_data, only: itype
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.INTERACT'
+!      include 'COMMON.CSA'
+       integer :: k,j,i,indg
+!cccccccccccccccccccccccc
+! Level-2: group
+!cccccccccccccccccccccccc
+
+      indg=0
+      do k=1,numch
+!cccccccccccccccccccccccccccccccccccccccc
+! Groups the THETAs and the GAMMAs
+       do j=2,nres-1
+         indg=indg+1
+         if (j.lt.nres-1) then
+           ngroup(indg)=2
+         else
+           ngroup(indg)=1
+         endif
+         do i=1,ngroup(indg)
+          igroup(1,i,indg)=i
+          igroup(2,i,indg)=j
+          igroup(3,i,indg)=k
+         enddo
+       enddo
+!cccccccccccccccccccccccccccccccccccccccc
+      enddo
+! Groups the ALPHAs and the BETAs
+      do k=1,numch
+       do j=2,nres-1
+        if(itype(j).ne.10) then
+         indg=indg+1
+         ngroup(indg)=2
+         do i=1,ngroup(indg)
+          igroup(1,i,indg)=i+2
+          igroup(2,i,indg)=j
+          igroup(3,i,indg)=k
+         enddo
+        endif
+       enddo
+      enddo
+
+      ntotgr=indg
+      write(iout,*) 
+      write(iout,*) "# of groups: ",ntotgr
+      do i=1,ntotgr
+       write(iout,41) i,ngroup(i),((igroup(k,j,i),k=1,3),j=1,ngroup(i))
+      enddo
+!      close(iout)
+
+   40 format(i3,3x,3i3)
+   41 format(2i3,3x,6(3i3,2x))
+
+      return
+      end subroutine make_array
+!-----------------------------------------------------------------------------
+      subroutine make_ranvar(n,m,idum)
+
+      use geometry_data
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.VAR'
+!      include 'COMMON.BANK'
+      integer :: n,m,j,idum,itrial,jeden
+
+! al      m=0
+      print *,'HOHOHOHO Make_RanVar!!!!!',n,m
+      itrial=0
+      do while(m.lt.n .and. itrial.le.10000)
+        itrial=itrial+1
+        jeden=1
+        call gen_rand_conf(jeden,*10)
+!        call intout
+        m=m+1
+        do j=2,nres-1
+          dihang_in(1,j,1,m)=theta(j+1)
+          dihang_in(2,j,1,m)=phi(j+2)
+          dihang_in(3,j,1,m)=alph(j)
+          dihang_in(4,j,1,m)=omeg(j)
+        enddo  
+        dihang_in(2,nres-1,1,m)=0.0d0
+        goto 20
+  10    write (iout,*) 'Failed to generate conformation #',m+1,&
+         ' itrial=',itrial
+  20    continue
+      enddo
+      print *,'Make_RanVar!!!!! m=',m,' itrial=',itrial
+
+      return
+      end subroutine make_ranvar
+!-----------------------------------------------------------------------------
+      subroutine make_ranvar_reg(n,idum)
+
+      use geometry_data
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.VAR'
+!      include 'COMMON.BANK'
+!      include 'COMMON.GEO'
+      integer :: n,idum,j,m,itrial,jeden
+
+      m=0
+      print *,'HOHOHOHO Make_RanVar!!!!!'
+      itrial=0
+      do while(m.lt.n .and. itrial.le.10000)
+        itrial=itrial+1
+        jeden=1
+        call gen_rand_conf(jeden,*10)
+!        call intout
+        m=m+1
+        do j=2,nres-1
+          dihang_in(1,j,1,m)=theta(j+1)
+          dihang_in(2,j,1,m)=phi(j+2)
+          dihang_in(3,j,1,m)=alph(j)
+          dihang_in(4,j,1,m)=omeg(j)
+          if(m.le.n*0.1) then
+           dihang_in(1,j,1,m)=90.0*deg2rad
+           dihang_in(2,j,1,m)=50.0*deg2rad
+          endif
+        enddo  
+        dihang_in(2,nres-1,1,m)=0.0d0
+        goto 20
+  10    write (iout,*) 'Failed to generate conformation #',m+1,&
+         ' itrial=',itrial
+  20    continue
+      enddo
+      print *,'Make_RanVar!!!!! m=',m,' itrial=',itrial
+
+      return
+      end subroutine make_ranvar_reg
+!-----------------------------------------------------------------------------
+! diff12.f
+!-----------------------------------------------------------------------------
+      subroutine get_diff12(aarray,barray,diff)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+      integer :: k,j,i
+      real(kind=8),dimension(mxang,nres,mxch) :: aarray,barray !(mxang,maxres,mxch)
+      real(kind=8) :: diff,dif
+
+      diff=0.d0
+      do k=1,numch
+       do j=2,nres-1
+!       do i=1,4
+!        do i=1,2
+        do i=1,ndiff
+         dif=rad2deg*dabs(aarray(i,j,k)-barray(i,j,k))
+         if(dif.gt.180.) dif=360.-dif
+         if (dif.gt.diffcut) diff=diff+dif
+        enddo
+       enddo
+      enddo
+
+      return
+      end subroutine get_diff12
+!-----------------------------------------------------------------------------
+! indexx.f
+!-----------------------------------------------------------------------------
+      subroutine indexx(n,arr,indx)
+
+!      implicit real*8 (a-h,o-z)
+      INTEGER :: n,indx(n)
+      REAL(kind=8) :: arr(n)
+!     PARAMETER (M=7,NSTACK=50)
+      integer,PARAMETER :: M=7,NSTACK=500
+      INTEGER :: i,indxt,ir,itemp,j,jstack,k,l,istack(NSTACK)
+      REAL(kind=8) :: a
+
+      do 11 j=1,n
+        indx(j)=j
+11    continue
+      jstack=0
+      l=1
+      ir=n
+1     if(ir-l.lt.M)then
+        do 13 j=l+1,ir
+          indxt=indx(j)
+          a=arr(indxt)
+          do 12 i=j-1,1,-1
+            if(arr(indx(i)).le.a)goto 2
+            indx(i+1)=indx(i)
+12        continue
+          i=0
+2         indx(i+1)=indxt
+13      continue
+        if(jstack.eq.0)return
+        ir=istack(jstack)
+        l=istack(jstack-1)
+        jstack=jstack-2
+      else
+        k=(l+ir)/2
+        itemp=indx(k)
+        indx(k)=indx(l+1)
+        indx(l+1)=itemp
+        if(arr(indx(l+1)).gt.arr(indx(ir)))then
+          itemp=indx(l+1)
+          indx(l+1)=indx(ir)
+          indx(ir)=itemp
+        endif
+        if(arr(indx(l)).gt.arr(indx(ir)))then
+          itemp=indx(l)
+          indx(l)=indx(ir)
+          indx(ir)=itemp
+        endif
+        if(arr(indx(l+1)).gt.arr(indx(l)))then
+          itemp=indx(l+1)
+          indx(l+1)=indx(l)
+          indx(l)=itemp
+        endif
+        i=l+1
+        j=ir
+        indxt=indx(l)
+        a=arr(indxt)
+3       continue
+          i=i+1
+        if(arr(indx(i)).lt.a)goto 3
+4       continue
+          j=j-1
+        if(arr(indx(j)).gt.a)goto 4
+        if(j.lt.i)goto 5
+        itemp=indx(i)
+        indx(i)=indx(j)
+        indx(j)=itemp
+        goto 3
+5       indx(l)=indx(j)
+        indx(j)=indxt
+        jstack=jstack+2
+        if(jstack.gt.NSTACK)pause 'NSTACK too small in indexx'
+        if(ir-i+1.ge.j-l)then
+          istack(jstack)=ir
+          istack(jstack-1)=i
+          ir=j-1
+        else
+          istack(jstack)=j-1
+          istack(jstack-1)=l
+          l=i
+        endif
+      endif
+      goto 1
+      end subroutine indexx
+!  (C) Copr. 1986-92 Numerical Recipes Software *11915aZ%.
+!-----------------------------------------------------------------------------
+! minim_jlee.F
+!-----------------------------------------------------------------------------
+      subroutine minim_jlee
+
+      use minim_data
+      use MPI_data
+      use energy_data
+      use compare_data
+      use control_data
+      use geometry_data, only: nvar,nphi
+      use geometry, only:dist
+      use energy, only:fdum
+      use control, only:init_int_table
+      use minimm, only:sumsl,deflt
+!  controls minimization and sorting routines
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.VAR'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.MINIM'
+!      include 'COMMON.CONTROL'
+      include 'mpif.h'
+      integer,parameter :: liv=60
+      integer :: lv
+!      external func,gradient!,fdum    !use minim & energy
+!      real(kind=4) :: ran1,ran2,ran3
+!      include 'COMMON.SETUP'
+!      include 'COMMON.GEO'
+!      include 'COMMON.FFIELD'
+!      include 'COMMON.SBRIDGE'
+!      include 'COMMON.DISTFIT'
+!      include 'COMMON.CHAIN'
+      integer,dimension(mpi_status_size) :: muster
+      real(kind=8),dimension(6*nres) :: var    !(maxvar) (maxvar=6*maxres)
+      real(kind=8),dimension(mxch*(mxch+1)/2+1) :: erg
+      real(kind=8),dimension(6*nres) :: var2   !(maxvar) (maxvar=6*maxres)
+      integer,dimension(nres) :: iffr  !(maxres)
+      integer,dimension((nres-1)*(nres-2)/2) :: ihpbt,jhpbt    !(maxdim) (maxdim=(maxres-1)*(maxres-2)/2)
+      real(kind=8),dimension(6*nres) :: d,garbage      !(maxvar) (maxvar=6*maxres)
+!el      real(kind=8),dimension(1:lv+1) :: v                 
+      real(kind=8) :: energia(0:n_ene),time0s,time1s
+      integer,dimension(9) :: indx
+      integer,dimension(12) :: info
+      integer,dimension(liv) :: iv                                               
+      integer :: idum(1)
+      real(kind=8) :: rdum(1)
+      integer,dimension(2,12*nres) :: icont_   !(2,maxcont)(maxcont=12*maxres)
+      logical :: fail  !check_var,
+      integer :: iloop(2)
+!el      common /przechowalnia/ v
+      integer :: i,j,ierr,n,nfun,nft_sc,nf,ierror,ierrcode
+      real(kind=8) :: rad,eee,etot     !,fdum
+!el  from subroutine parmread
+! Define the constants of the disulfide bridge
+! Old arbitrary potential
+      real(kind=8),parameter :: dbr=4.20D0
+      real(kind=8),parameter :: fbr=3.30D0
+!-----------------
+      lv=77+(6*nres)*(6*nres+17)/2     !77+maxvar*(maxvar+17)/2 (maxvar=6*maxres)
+      data rad /1.745329252d-2/
+!  receive # of start
+!      print *,'Processor',me,' calling MINIM_JLEE maxfun',maxfun,
+!     &   ' maxmin',maxmin,' tolf',tolf,' rtolf',rtolf
+      if (.not. allocated(v)) allocate(v(1:lv))
+      nhpb0=nhpb
+   10 continue
+      time0s=MPI_WTIME()
+!      print *, 'MINIM_JLEE: ',me,' is waiting'
+      call mpi_recv(info,12,mpi_integer,king,idint,CG_COMM,&
+                    muster,ierr)
+      time1s=MPI_WTIME()
+      write (iout,'(a12,f10.4,a4)')'Waiting for ',time1s-time0s,' sec'
+      call flush(iout)
+       n=info(1)
+!      print *, 'MINIM_JLEE: ',me,' received: ',n
+      
+!rc      if (ierr.ne.0) go to 100
+!  if # = 0, return
+      if (n.eq.0) then 
+        write (iout,*) 'Finishing minim_jlee - signal',n,' from master'
+        call flush(iout)
+        return
+      endif
+
+      nfun=0
+      IF (n.lt.0) THEN
+       call mpi_recv(var,nvar,mpi_double_precision,&
+                    king,idreal,CG_COMM,muster,ierr)
+       call mpi_recv(iffr,nres,mpi_integer,&
+                    king,idint,CG_COMM,muster,ierr)
+       call mpi_recv(var2,nvar,mpi_double_precision,&
+                    king,idreal,CG_COMM,muster,ierr)
+      ELSE
+!  receive initial values of variables
+       call mpi_recv(var,nvar,mpi_double_precision,&
+                    king,idreal,CG_COMM,muster,ierr)
+!rc       if (ierr.ne.0) go to 100
+      ENDIF
+
+      if(vdisulf.and.info(2).ne.-1) then
+        if(info(4).ne.0)then
+           call mpi_recv(ihpbt,info(4),mpi_integer,&
+                    king,idint,CG_COMM,muster,ierr)
+           call mpi_recv(jhpbt,info(4),mpi_integer,&
+                    king,idint,CG_COMM,muster,ierr)
+        endif
+      endif  
+
+      IF (n.lt.0) THEN
+        n=-n     
+        nhpb=nhpb0
+        link_start=1
+        link_end=nhpb
+        call init_int_table
+        call contact_cp(var,var2,iffr,nfun,n)
+      ENDIF
+
+      if(vdisulf.and.info(2).ne.-1) then
+        nss=0
+        if(info(4).ne.0)then
+!d          write(iout,*) 'SS=',info(4),'N=',info(1),'IT=',info(2)
+          call var_to_geom(nvar,var)
+          call chainbuild
+          do i=1,info(4)
+           if (dist(ihpbt(i),jhpbt(i)).lt.7.0) then
+            nss=nss+1
+            ihpb(nss)=ihpbt(i)
+            jhpb(nss)=jhpbt(i)
+!d            write(iout,*) 'SS  mv=',info(3),
+!d     &         ihpb(nss)-nres,jhpb(nss)-nres,
+!d     &         dist(ihpb(nss),jhpb(nss))
+            dhpb(nss)=dbr
+            forcon(nss)=fbr
+           else
+!d            write(iout,*) 'rm SS  mv=',info(3),
+!d     &         ihpbt(i)-nres,jhpbt(i)-nres,dist(ihpbt(i),jhpbt(i))
+           endif
+          enddo
+        endif
+        nhpb=nss
+        link_start=1
+        link_end=nhpb
+        call init_int_table
+      endif
+
+      if (info(3).eq.14) then
+       write(iout,*) 'calling local_move',info(7),info(8)
+       call local_move_init(.false.)
+       call var_to_geom(nvar,var)
+       call local_move(info(7),info(8),20d0,50d0)
+       call geom_to_var(nvar,var)
+      endif
+
+
+      if (info(3).eq.16) then
+       write(iout,*) 'calling beta_slide',info(7),info(8),&
+                  info(10), info(11), info(12)
+       call var_to_geom(nvar,var)
+       call beta_slide(info(7),info(8),info(10),info(11),info(12), &
+                                                           nfun,n)
+       call geom_to_var(nvar,var)
+      endif
+
+
+      if (info(3).eq.17) then
+       write(iout,*) 'calling beta_zip',info(7),info(8)
+       call var_to_geom(nvar,var)
+       call beta_zip(info(7),info(8),nfun,n)
+       call geom_to_var(nvar,var)
+      endif
+
+
+!rc overlap test
+
+      if (overlapsc) then 
+
+          call var_to_geom(nvar,var)
+          call chainbuild
+          call etotal(energia)
+          nfun=nfun+1
+          if (energia(1).eq.1.0d20) then  
+            info(3)=-info(3) 
+            write (iout,'(a,1pe14.5)')'#OVERLAP evdw=1d20',energia(1)
+            call overlap_sc(fail)
+            if(.not.fail) then
+             call geom_to_var(nvar,var)
+             call etotal(energia)
+             nfun=nfun+1
+             write (iout,'(a,1pe14.5)')'#OVERLAP evdw after',energia(1)
+            else
+             v(10)=1.0d20
+             iv(1)=-1
+             goto 201
+            endif
+          endif
+      endif 
+
+      if (searchsc) then 
+          call var_to_geom(nvar,var)
+          call sc_move(2,nres-1,1,10d0,nft_sc,etot)
+          call geom_to_var(nvar,var)
+!d          write(iout,*) 'sc_move',nft_sc,etot
+      endif 
+
+      if (check_var(var,info)) then 
+           v(10)=1.0d21
+           iv(1)=6
+           goto 201
+      endif
+
+
+!rc        
+
+!      write (iout,*) 'MINIM_JLEE: Processor',me,' nvar',nvar
+!      write (iout,'(8f10.4)') (var(i),i=1,nvar)
+!      write (*,*) 'MINIM_JLEE: Processor',me,' received nvar',nvar
+!      write (*,'(8f10.4)') (var(i),i=1,nvar)
+
+       do i=1,nvar
+         garbage(i)=var(i)
+       enddo
+
+      call deflt(2,iv,liv,lv,v)                                         
+! 12 means fresh start, dont call deflt                                 
+      iv(1)=12                                                          
+! max num of fun calls                                                  
+      if (maxfun.eq.0) maxfun=500
+      iv(17)=maxfun
+! max num of iterations                                                 
+      if (maxmin.eq.0) maxmin=1000
+      iv(18)=maxmin
+! controls output                                                       
+      iv(19)=2                                                          
+! selects output unit                                                   
+!d      iv(21)=iout                                                       
+      iv(21)=0
+! 1 means to print out result                                           
+      iv(22)=0                                                          
+!d        iv(22)=1
+! 1 means to print out summary stats                                    
+      iv(23)=0                                                          
+! 1 means to print initial x and d                                      
+      iv(24)=0                                                          
+
+!      if(me.eq.3.and.n.eq.255) then
+!       print *,' CHUJ: stoi'
+!       iv(21)=6
+!       iv(22)=1
+!       iv(23)=1
+!       iv(24)=1                                                          
+!      endif
+
+! min val for v(radfac) default is 0.1                                  
+      v(24)=0.1D0                                                       
+! max val for v(radfac) default is 4.0                                  
+      v(25)=2.0D0                                                       
+!     v(25)=4.0D0                                                       
+! check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease)    
+! the sumsl default is 0.1                                              
+      v(26)=0.1D0
+! false conv if (act fnctn decrease) .lt. v(34)                         
+! the sumsl default is 100*machep                                       
+      v(34)=v(34)/100.0D0                                               
+! absolute convergence                                                  
+      if (tolf.eq.0.0D0) tolf=1.0D-4
+      v(31)=tolf
+! relative convergence                                                  
+      if (rtolf.eq.0.0D0) rtolf=1.0D-4
+      v(32)=rtolf
+! controls initial step size                                            
+       v(35)=1.0D-1                                                    
+! large vals of d correspond to small components of step                
+      do i=1,nphi
+        d(i)=1.0D-1
+      enddo
+      do i=nphi+1,nvar
+        d(i)=1.0D-1
+      enddo
+!  minimize energy
+!      write (iout,*) 'Processor',me,' nvar',nvar
+!      write (iout,*) 'Variables BEFORE minimization:'
+!      write (iout,'(8f10.4)') (rad2deg*var(i),i=1,nvar)
+
+!      print *, 'MINIM_JLEE: ',me,' before SUMSL '
+
+      call func(nvar,var,nf,eee,idum,rdum,fdum)
+      nfun=nfun+1
+      if(eee.ge.1.0d20) then
+!       print *,'MINIM_JLEE: ',me,' CHUJ NASTAPIL'
+!       print *,' energy before SUMSL =',eee
+!       print *,' aborting local minimization'
+       iv(1)=-1
+       v(10)=eee
+       go to 201
+      endif
+
+!t      time0s=MPI_WTIME()
+      call sumsl(nvar,d,var,func,gradient,iv,liv,lv,v,idum,rdum,fdum)
+!t      write(iout,*) 'sumsl time=',MPI_WTIME()-time0s,iv(7),v(10)
+!      print *, 'MINIM_JLEE: ',me,' after SUMSL '
+
+!  find which conformation was returned from sumsl
+        nfun=nfun+iv(7)
+!      print *,'Processor',me,' iv(17)',iv(17),' iv(18)',iv(18),' nf',nf,
+!     & ' retcode',iv(1),' energy',v(10),' tolf',v(31),' rtolf',v(32)
+!        if (iv(1).ne.4 .or. nf.le.1) then
+!          write (*,*) 'Processor',me,' something bad in SUMSL',iv(1),nf
+!         write (*,*) 'Initial Variables'
+!         write (*,'(8f10.4)') (rad2deg*garbage(i),i=1,nvar)
+!         write (*,*) 'Variables'
+!         write (*,'(8f10.4)') (rad2deg*var(i),i=1,nvar)
+!         write (*,*) 'Vector d'
+!         write (*,'(8f10.4)') (d(i),i=1,nvar)
+!         write (iout,*) 'Processor',me,' something bad in SUMSL',
+!    &       iv(1),nf
+!         write (iout,*) 'Initial Variables'
+!         write (iout,'(8f10.4)') (rad2deg*garbage(i),i=1,nvar)
+!         write (iout,*) 'Variables'
+!         write (iout,'(8f10.4)') (rad2deg*var(i),i=1,nvar)
+!         write (iout,*) 'Vector d'
+!         write (iout,'(8f10.4)') (d(i),i=1,nvar)
+!        endif
+!        if (nf.lt.iv(6)-1) then
+!  recalculate intra- and interchain energies
+!         call func(nvar,var,nf,v(10),iv,v,fdum)
+!        else if (nf.eq.iv(6)-1) then
+!  regenerate conformation
+!         call var_to_geom(nvar,var)
+!         call chainbuild
+!        endif
+!  change origin and axes to standard ECEPP format
+!        call var_to_geom(nvar,var)
+!      write (iout,*) 'MINIM_JLEE after minim: Processor',me,' nvar',nvar
+!      write (iout,'(8f10.4)') (var(i),i=1,nvar)
+!      write (iout,*) 'Energy:',v(10)
+!  send back output
+!       print *, 'MINIM_JLEE: ',me,' minimized: ',n
+  201  continue
+        indx(1)=n
+! return code: 6-gradient 9-number of ftn evaluation, etc
+        indx(2)=iv(1)
+! total # of ftn evaluations (for iwf=0, it includes all minimizations).
+        indx(3)=nfun
+        indx(4)=info(2)
+        indx(5)=info(3)
+        indx(6)=nss
+        indx(7)=info(5)
+        indx(8)=info(6)
+        indx(9)=info(9)
+        call mpi_send(indx,9,mpi_integer,king,idint,CG_COMM,&
+                       ierr)
+!  send back energies
+! al & cc
+! calculate contact order
+#ifdef CO_BIAS
+        call contact(.false.,ncont,icont_,co)
+        erg(1)=v(10)-1.0d2*co
+#else
+        erg(1)=v(10)
+#endif
+        j=1
+        call mpi_send(erg,j,mpi_double_precision,king,idreal,&
+                       CG_COMM,ierr)
+#ifdef CO_BIAS
+        call mpi_send(co,j,mpi_double_precision,king,idreal,&
+                       CG_COMM,ierr)
+#endif
+!  send back values of variables
+        call mpi_send(var,nvar,mpi_double_precision,&
+                     king,idreal,CG_COMM,ierr)
+!        print * , 'MINIM_JLEE: Processor',me,' send erg and var '
+
+        if(vdisulf.and.info(2).ne.-1.and.nss.ne.0) then
+!d          call intout
+!d          call chainbuild
+!d          call etotal(energia(0))
+!d          etot=energia(0)
+!d          call enerprint(energia(0))
+         call mpi_send(ihpb,nss,mpi_integer,&
+                     king,idint,CG_COMM,ierr)        
+         call mpi_send(jhpb,nss,mpi_integer,&
+                     king,idint,CG_COMM,ierr)        
+        endif
+
+        go to 10
+  100 print *, ' error in receiving message from emperor', me
+      call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      return
+  200 print *, ' error in sending message to emperor'
+      call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      return
+  300 print *, ' error in communicating with emperor'
+      call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      return
+  956 format (' initial energy could not be calculated',41x)
+  957 format (80x)
+  965 format (' convergence code ',i2,' # of function calls ',&
+        i4,' # of gradient calls ',i4,10x)
+  975 format (' energy ',1p,e12.4,' scaled gradient ',e11.3,32x)
+      end subroutine minim_jlee
+!-----------------------------------------------------------------------------
+! newconf.f
+!-----------------------------------------------------------------------------
+      subroutine make_var(n,idum,iter_csa)
+
+      use MD_data
+      use energy_data
+      use compare_data
+      use control_data, only: vdisulf
+      use geometry_data
+      use geometry, only: dist
+      include 'mpif.h'
+
+!      use random, only: iran_num,ran_number
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.INTERACT'
+!      include 'COMMON.HAIRPIN'
+!      include 'COMMON.VAR'
+!      include 'COMMON.DISTFIT'
+!      include 'COMMON.GEO'
+!      include 'COMMON.CONTROL'
+      logical :: nicht_getan,nicht_getan1,fail,lfound
+      integer :: nharp,iharp(4,nres/3),nconf_harp
+      integer :: iisucc(mxio)
+      logical :: ifused(mxio)
+      integer :: nhx_seed(nseed),ihx_seed(4,nres/3,nseed) !max_seed
+      integer :: nhx_use(nseed),ihx_use(0:4,nres/3,nseed)
+      integer :: nlx_seed(nseed),ilx_seed(2,nres/3,nseed),&
+               nlx_use(nseed),ilx_use(nres/3,nseed)
+!      real(kind=4) :: ran1,ran2
+
+      integer :: i,j,k,n,idum,iter_csa,iran,index,n7frag,n8frag,n14frag,&
+            n15frag,nbefrag,nlx_tot,iters,i1,i2,i3,ntot_gen,ngen,iih,&
+            ij,jr,iim,nhx_tot,idummy,iter,iif,iig,icheck,ishift,iang,&
+            n8c,ih_start,ih_end,n7c,index2,isize,nsucc,nacc,j1,nran,&
+            ierror,ierrcode
+      real(kind=8) :: d
+
+      write (iout,*) 'make_var : nseed=',nseed,'ntry=',n
+      index=0
+
+!-----------------------------------------
+      if (n7.gt.0.or.n8.gt.0.or.n9.gt.0.or.n14.gt.0.or.n15.gt.0 &
+          .or.n16.gt.0.or.n17.gt.0.or.n18.gt.0) &
+                 call select_frag(n7frag,n8frag,n14frag,&
+                 n15frag,nbefrag,iter_csa) 
+
+!---------------------------------------------------
+! N18 - random perturbation of one phi(=gamma) angle in a loop
+!
+      IF (n18.gt.0) THEN
+      nlx_tot=0
+      do iters=1,nseed
+        i1=is(iters)
+        nlx_seed(iters)=0
+        do i2=1,n14frag
+          if (lvar_frag(i2,1).eq.i1) then
+            nlx_seed(iters)=nlx_seed(iters)+5
+            ilx_seed(1,nlx_seed(iters),iters)=lvar_frag(i2,2)
+            ilx_seed(2,nlx_seed(iters),iters)=lvar_frag(i2,3)
+            ilx_use(nlx_seed(iters),iters)=5
+          endif
+        enddo
+        nlx_use(iters)=nlx_seed(iters)
+        nlx_tot=nlx_tot+nlx_seed(iters)
+      enddo
+
+      if (nlx_tot .ge. n18*nseed) then
+        ntot_gen=n18*nseed
+      else
+        ntot_gen=(nlx_tot/nseed)*nseed
+      endif
+
+      ngen=0
+      do while (ngen.lt.ntot_gen)
+      do iters=1,nseed
+        iseed=is(iters)
+        if (nlx_use(iters).gt.0) then
+          nicht_getan=.true.
+          do while (nicht_getan)
+            iih=iran_num(1,nlx_seed(iters))
+            if (ilx_use(iih,iters).gt.0) then
+              nicht_getan=.false.
+              ilx_use(iih,iters)=ilx_use(iih,iters)-1
+              nlx_use(iters)=nlx_use(iters)-1
+            endif
+          enddo
+          ngen=ngen+1
+          index=index+1
+          movenx(index)=18
+          parent(1,index)=iseed
+          parent(2,index)=0
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+           
+
+          do k=1,numch
+            do j=2,nres-1
+              do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+              enddo
+            enddo
+          enddo
+
+          jr=iran_num(ilx_seed(1,iih,iters),ilx_seed(2,iih,iters))
+          d=ran_number(-pi,pi)
+          dihang_in(2,jr-2,1,index)=pinorm(dihang_in(2,jr-2,1,index)+d)
+
+
+          if (ngen.eq.ntot_gen) goto 145
+        endif
+      enddo
+      enddo
+  145 continue
+
+      ENDIF
+
+
+!-----------------------------------------
+! N17 : zip a beta in a seed by forcing one additional p-p contact
+!
+      IF (n17.gt.0) THEN
+      nhx_tot=0
+      do iters=1,nseed
+        i1=is(iters)
+        nhx_seed(iters)=0
+        nhx_use(iters)=0
+        do i2=1,nbefrag
+          if (avar_frag(i2,1).eq.i1) then
+            nhx_seed(iters)=nhx_seed(iters)+1
+            ihx_use(2,nhx_seed(iters),iters)=1
+            if (avar_frag(i2,5)-avar_frag(i2,3).le.3.and. &
+                 avar_frag(i2,2).gt.1.and.avar_frag(i2,4).lt.nres) then
+             ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,2)-1
+             ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,4)+1
+             ihx_use(0,nhx_seed(iters),iters)=1
+             ihx_use(1,nhx_seed(iters),iters)=0
+             nhx_use(iters)=nhx_use(iters)+1
+            else
+              if (avar_frag(i2,4).gt.avar_frag(i2,5)) then
+               if (avar_frag(i2,2).gt.1.and. &
+                           avar_frag(i2,4).lt.nres) then
+                ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,2)-1
+                ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,4)+1
+                ihx_use(0,nhx_seed(iters),iters)=1
+                ihx_use(1,nhx_seed(iters),iters)=0
+                nhx_use(iters)=nhx_use(iters)+1
+               endif
+               if (avar_frag(i2,3).lt.nres.and. &
+                           avar_frag(i2,5).gt.1) then
+                ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,3)+1
+                ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,5)-1
+                ihx_use(0,nhx_seed(iters),iters)= &
+                          ihx_use(0,nhx_seed(iters),iters)+1
+                ihx_use(2,nhx_seed(iters),iters)=0
+                nhx_use(iters)=nhx_use(iters)+1
+               endif
+              else
+               if (avar_frag(i2,2).gt.1.and. &
+                           avar_frag(i2,4).gt.1) then
+                ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,2)-1
+                ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,4)-1
+                ihx_use(0,nhx_seed(iters),iters)=1
+                ihx_use(1,nhx_seed(iters),iters)=0
+                nhx_use(iters)=nhx_use(iters)+1
+               endif
+               if (avar_frag(i2,3).lt.nres.and. &
+                           avar_frag(i2,5).lt.nres) then
+                ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,3)+1
+                ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,5)+1
+                ihx_use(0,nhx_seed(iters),iters)= &
+                          ihx_use(0,nhx_seed(iters),iters)+1
+                ihx_use(2,nhx_seed(iters),iters)=0
+                nhx_use(iters)=nhx_use(iters)+1
+               endif
+              endif
+            endif
+          endif
+        enddo
+
+        nhx_tot=nhx_tot+nhx_use(iters)
+!d        write (iout,*) "debug N17",iters,nhx_seed(iters),
+!d     &                     nhx_use(iters),nhx_tot
+      enddo
+
+      if (nhx_tot .ge. n17*nseed) then
+        ntot_gen=n17*nseed
+      else if (nhx_tot .ge. nseed) then
+        ntot_gen=(nhx_tot/nseed)*nseed
+      else
+        ntot_gen=nhx_tot
+      endif
+!d      write (iout,*) "debug N17==",ntot_gen,nhx_tot,nseed
+
+      ngen=0
+      do while (ngen.lt.ntot_gen)
+      do iters=1,nseed
+        iseed=is(iters)
+        if (nhx_use(iters).gt.0) then
+!d          write (iout,*) "debug N17",nhx_use(iters),ngen,ntot_gen
+!d          write (iout,*) "debugN17^",
+!d     &                    (ihx_use(0,k,iters),k=1,nhx_use(iters))
+          nicht_getan=.true.
+          do while (nicht_getan)
+            iih=iran_num(1,nhx_seed(iters))
+!d            write (iout,*) "debugN17^",iih
+            if (ihx_use(0,iih,iters).gt.0) then
+              iim=iran_num(1,2)
+!d                write (iout,*) "debugN17=",iih,nhx_seed(iters)
+!d                write (iout,*) "debugN17-",iim,'##',
+!d     &                           (ihx_use(k,iih,iters),k=0,2)
+!d                call flush(iout)
+              do while (ihx_use(iim,iih,iters).eq.1)
+                iim=iran_num(1,2)
+!d                write (iout,*) "debugN17-",iim,'##',
+!d     &                           (ihx_use(k,iih,iters),k=0,2)
+!d                call flush(iout)
+              enddo
+              nicht_getan=.false.
+              ihx_use(iim,iih,iters)=1
+              ihx_use(0,iih,iters)=ihx_use(0,iih,iters)-1 
+              nhx_use(iters)=nhx_use(iters)-1
+            endif
+          enddo
+          ngen=ngen+1
+          index=index+1
+          movenx(index)=17
+          parent(1,index)=iseed
+          parent(2,index)=0
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+          do k=1,numch
+            do j=2,nres-1
+              do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+              enddo
+            enddo
+          enddo
+
+          if (iim.eq.1) then
+            idata(1,index)=ihx_seed(1,iih,iters)
+            idata(2,index)=ihx_seed(2,iih,iters)
+          else
+            idata(1,index)=ihx_seed(3,iih,iters)
+            idata(2,index)=ihx_seed(4,iih,iters)
+          endif
+
+          if (ngen.eq.ntot_gen) goto 115
+        endif
+      enddo
+      enddo
+  115 continue
+      write (iout,*) "N17",n17," ngen/nseed",ngen/nseed,&
+                                 ngen,nseed
+
+
+      ENDIF
+!-----------------------------------------
+! N16 : slide non local beta in a seed by +/- 1 or +/- 2
+!
+      IF (n16.gt.0) THEN
+      nhx_tot=0
+      do iters=1,nseed
+        i1=is(iters)
+        nhx_seed(iters)=0
+        do i2=1,n7frag
+          if (bvar_frag(i2,1).eq.i1) then
+            nhx_seed(iters)=nhx_seed(iters)+1
+            ihx_seed(1,nhx_seed(iters),iters)=bvar_frag(i2,3)
+            ihx_seed(2,nhx_seed(iters),iters)=bvar_frag(i2,4)
+            ihx_seed(3,nhx_seed(iters),iters)=bvar_frag(i2,5)
+            ihx_seed(4,nhx_seed(iters),iters)=bvar_frag(i2,6)
+            ihx_use(0,nhx_seed(iters),iters)=4
+            do i3=1,4
+              ihx_use(i3,nhx_seed(iters),iters)=0
+            enddo
+          endif
+        enddo
+        nhx_use(iters)=4*nhx_seed(iters)
+        nhx_tot=nhx_tot+nhx_seed(iters)
+!d        write (iout,*) "debug N16",iters,nhx_seed(iters)
+      enddo
+
+      if (4*nhx_tot .ge. n16*nseed) then
+        ntot_gen=n16*nseed
+      else if (4*nhx_tot .ge. nseed) then
+        ntot_gen=(4*nhx_tot/nseed)*nseed
+      else
+        ntot_gen=4*nhx_tot
+      endif
+      write (iout,*) "debug N16",ntot_gen,4*nhx_tot,nseed
+
+      ngen=0
+      do while (ngen.lt.ntot_gen)
+      do iters=1,nseed
+        iseed=is(iters)
+        if (nhx_use(iters).gt.0) then
+          nicht_getan=.true.
+          do while (nicht_getan)
+            iih=iran_num(1,nhx_seed(iters))
+            if (ihx_use(0,iih,iters).gt.0) then
+              iim=iran_num(1,4)
+              do while (ihx_use(iim,iih,iters).eq.1)
+!d                write (iout,*) iim,
+!d     &                ihx_use(0,iih,iters),ihx_use(iim,iih,iters)
+                iim=iran_num(1,4)
+              enddo
+              nicht_getan=.false.
+              ihx_use(iim,iih,iters)=1
+              ihx_use(0,iih,iters)=ihx_use(0,iih,iters)-1 
+              nhx_use(iters)=nhx_use(iters)-1
+            endif
+          enddo
+          ngen=ngen+1
+          index=index+1
+          movenx(index)=16
+          parent(1,index)=iseed
+          parent(2,index)=0
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+          do k=1,numch
+            do j=2,nres-1
+              do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+              enddo
+            enddo
+          enddo
+
+          do i=1,4
+           idata(i,index)=ihx_seed(i,iih,iters)
+          enddo
+          idata(5,index)=iim           
+
+          if (ngen.eq.ntot_gen) goto 116
+        endif
+      enddo
+      enddo
+  116 continue
+      write (iout,*) "N16",n16," ngen/nseed",ngen/nseed,&
+                                 ngen,nseed
+      ENDIF
+!-----------------------------------------
+! N15 : copy two 2nd structure elements from 1 or 2 conf. in bank to a seed
+!
+      IF (n15.gt.0) THEN
+
+       do iters=1,nseed
+         iseed=is(iters)
+         do i=1,mxio
+           ifused(i)=.false.
+         enddo
+
+         do idummy=1,n15
+           iter=0
+   84      continue
+
+           iran=0
+           iif=iran_num(1,n15frag)
+           do while( (ifused(iif) .or. svar_frag(iif,1).eq.iseed) .and. &
+                            iran.le.mxio )
+            iif=iran_num(1,n15frag)
+            iran=iran+1
+           enddo
+           if(iran.ge.mxio) goto 811
+
+           iran=0
+           iig=iran_num(1,n15frag)
+           do while( (ifused(iig) .or. svar_frag(iig,1).eq.iseed  .or. &
+                   .not.(svar_frag(iif,3).lt.svar_frag(iig,2).or. &
+                         svar_frag(iig,3).lt.svar_frag(iif,2)) ) .and. &
+                            iran.le.mxio )
+            iig=iran_num(1,n15frag)
+            iran=iran+1
+           enddo
+           if(iran.ge.mxio) goto 811
+
+           index=index+1
+           movenx(index)=15
+           parent(1,index)=iseed
+           parent(2,index)=svar_frag(iif,1)
+           parent(3,index)=svar_frag(iig,1)
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+           ifused(iif)=.true.
+           ifused(iig)=.true.
+           call newconf_copy(idum,dihang_in(1,1,1,index),&
+                   svar_frag(iif,1),svar_frag(iif,2),svar_frag(iif,3))
+
+           do j=svar_frag(iig,2),svar_frag(iig,3)
+             do i=1,4
+              dihang_in(i,j,1,index)=bvar(i,j,1,svar_frag(iig,1))
+             enddo
+           enddo
+
+
+           if(iter.lt.10) then
+            call check_old(icheck,index)
+            if(icheck.eq.1) then 
+              index=index-1
+              ifused(iif)=.false. 
+              goto 84
+            endif
+           endif
+
+  811     continue
+         enddo
+       enddo
+      ENDIF
+
+!-----------------------------------------
+! N14 local_move (Maurizio) for loops in a seed
+!
+      IF (n14.gt.0) THEN
+      nlx_tot=0
+      do iters=1,nseed
+        i1=is(iters)
+        nlx_seed(iters)=0
+        do i2=1,n14frag
+          if (lvar_frag(i2,1).eq.i1) then
+            nlx_seed(iters)=nlx_seed(iters)+3
+            ilx_seed(1,nlx_seed(iters),iters)=lvar_frag(i2,2)
+            ilx_seed(2,nlx_seed(iters),iters)=lvar_frag(i2,3)
+            ilx_use(nlx_seed(iters),iters)=3
+          endif
+        enddo
+        nlx_use(iters)=nlx_seed(iters)
+        nlx_tot=nlx_tot+nlx_seed(iters)
+!d        write (iout,*) "debug N14",iters,nlx_seed(iters)
+      enddo
+
+      if (nlx_tot .ge. n14*nseed) then
+        ntot_gen=n14*nseed
+      else
+        ntot_gen=(nlx_tot/nseed)*nseed
+      endif
+!d      write (iout,*) "debug N14",ntot_gen,n14frag,nseed
+
+      ngen=0
+      do while (ngen.lt.ntot_gen)
+      do iters=1,nseed
+        iseed=is(iters)
+        if (nlx_use(iters).gt.0) then
+          nicht_getan=.true.
+          do while (nicht_getan)
+            iih=iran_num(1,nlx_seed(iters))
+            if (ilx_use(iih,iters).gt.0) then
+              nicht_getan=.false.
+              ilx_use(iih,iters)=ilx_use(iih,iters)-1
+              nlx_use(iters)=nlx_use(iters)-1
+            endif
+          enddo
+          ngen=ngen+1
+          index=index+1
+          movenx(index)=14
+          parent(1,index)=iseed
+          parent(2,index)=0
+
+          idata(1,index)=ilx_seed(1,iih,iters)
+          idata(2,index)=ilx_seed(2,iih,iters)
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+           
+
+          do k=1,numch
+            do j=2,nres-1
+              do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+              enddo
+            enddo
+          enddo
+
+          if (ngen.eq.ntot_gen) goto 131
+        endif
+      enddo
+      enddo
+  131 continue
+!d      write (iout,*) "N14",n14," ngen/nseed",ngen/nseed,
+!d     &                           ngen,nseed
+
+      ENDIF
+!-----------------------------------------
+! N9 : shift a helix in a seed
+!
+      IF (n9.gt.0) THEN
+      nhx_tot=0
+      do iters=1,nseed
+        i1=is(iters)
+        nhx_seed(iters)=0
+        do i2=1,n8frag
+          if (hvar_frag(i2,1).eq.i1) then
+            nhx_seed(iters)=nhx_seed(iters)+1
+            ihx_seed(1,nhx_seed(iters),iters)=hvar_frag(i2,2)
+            ihx_seed(2,nhx_seed(iters),iters)=hvar_frag(i2,3)
+            ihx_use(0,nhx_seed(iters),iters)=4
+            do i3=1,4
+              ihx_use(i3,nhx_seed(iters),iters)=0
+            enddo
+          endif
+        enddo
+        nhx_use(iters)=4*nhx_seed(iters)
+        nhx_tot=nhx_tot+nhx_seed(iters)
+!d        write (iout,*) "debug N9",iters,nhx_seed(iters)
+      enddo
+
+      if (4*nhx_tot .ge. n9*nseed) then
+        ntot_gen=n9*nseed
+      else
+        ntot_gen=(4*nhx_tot/nseed)*nseed
+      endif
+!d      write (iout,*) "debug N9",ntot_gen,n8frag,nseed
+
+      ngen=0
+      do while (ngen.lt.ntot_gen)
+      do iters=1,nseed
+        iseed=is(iters)
+        if (nhx_use(iters).gt.0) then
+          nicht_getan=.true.
+          do while (nicht_getan)
+            iih=iran_num(1,nhx_seed(iters))
+            if (ihx_use(0,iih,iters).gt.0) then
+              iim=iran_num(1,4)
+              do while (ihx_use(iim,iih,iters).eq.1)
+!d                write (iout,*) iim,
+!d     &                ihx_use(0,iih,iters),ihx_use(iim,iih,iters)
+                iim=iran_num(1,4)
+              enddo
+              nicht_getan=.false.
+              ihx_use(iim,iih,iters)=1
+              ihx_use(0,iih,iters)=ihx_use(0,iih,iters)-1 
+              nhx_use(iters)=nhx_use(iters)-1
+            endif
+          enddo
+          ngen=ngen+1
+          index=index+1
+          movenx(index)=9
+          parent(1,index)=iseed
+          parent(2,index)=0
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+          do k=1,numch
+            do j=2,nres-1
+              do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+              enddo
+            enddo
+          enddo
+
+          jstart=max(nnt,ihx_seed(1,iih,iters)+1)
+          jend=min(nct,ihx_seed(2,iih,iters))
+!d          write (iout,*) "debug N9",iters,iih,jstart,jend
+          if (iim.eq.1) then
+            ishift=-2
+          else if (iim.eq.2) then
+            ishift=-1
+          else if (iim.eq.3) then
+            ishift=1
+          else if (iim.eq.4) then
+            ishift=2
+          else
+            write (iout,*) 'CHUJ NASTAPIL: iim=',iim
+#ifdef MPI !el
+            call mpi_abort(mpi_comm_world,ierror,ierrcode)
+#endif
+          endif
+          do j=jstart,jend
+            if (itype(j).eq.10) then
+              iang=2
+            else
+              iang=4
+            endif
+            do i=1,iang
+              if (j+ishift.ge.nnt.and.j+ishift.le.nct) &
+                dihang_in(i,j+ishift,1,index)=bvar(i,j,1,iseed)
+            enddo
+          enddo
+          if (ishift.gt.0) then
+           do j=0,ishift-1
+            if (itype(jend+j).eq.10) then
+              iang=2
+            else
+              iang=4
+            endif
+            do i=1,iang
+              if (jend+j.ge.nnt.and.jend+j.le.nct) &
+                dihang_in(i,jstart+j,1,index)=bvar(i,jend+j,1,iseed)
+            enddo
+           enddo
+          else
+           do j=0,-ishift-1
+            if (itype(jstart+j).eq.10) then
+              iang=2
+            else
+              iang=4
+            endif
+            do i=1,iang
+              if (jend+j.ge.nnt.and.jend+j.le.nct) &
+                dihang_in(i,jend+j,1,index)=bvar(i,jstart+j,1,iseed)
+            enddo
+           enddo
+          endif
+          if (ngen.eq.ntot_gen) goto 133
+        endif
+      enddo
+      enddo
+  133 continue
+!d      write (iout,*) "N9",n9," ngen/nseed",ngen/nseed,
+!d     &                           ngen,nseed
+
+      ENDIF
+!-----------------------------------------
+! N8 : copy a helix from bank to seed
+!
+      if (n8.gt.0) then 
+       if (n8frag.lt.n8) then 
+          write (iout,*) "N8: only ",n8frag,'helices'
+          n8c=n8frag
+       else
+          n8c=n8
+       endif
+
+       do iters=1,nseed
+         iseed=is(iters)
+         do i=1,mxio
+           ifused(i)=.false.
+         enddo
+
+
+         do idummy=1,n8c
+           iter=0
+   94      continue
+           iran=0
+           iif=iran_num(1,n8frag)
+           do while( (ifused(iif) .or. hvar_frag(iif,1).eq.iseed) .and. &
+                            iran.le.mxio )
+            iif=iran_num(1,n8frag)
+            iran=iran+1
+           enddo
+            
+           if(iran.ge.mxio) goto 911
+
+           index=index+1
+           movenx(index)=8
+           parent(1,index)=iseed
+           parent(2,index)=hvar_frag(iif,1)
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+           ifused(iif)=.true.
+           if (hvar_frag(iif,3)-hvar_frag(iif,2).le.6) then
+             call newconf_copy(idum,dihang_in(1,1,1,index),&
+                   hvar_frag(iif,1),hvar_frag(iif,2),hvar_frag(iif,3))
+           else
+              ih_start=iran_num(hvar_frag(iif,2),hvar_frag(iif,3)-6)
+              ih_end=iran_num(ih_start,hvar_frag(iif,3))
+             call newconf_copy(idum,dihang_in(1,1,1,index),&
+                   hvar_frag(iif,1),ih_start,ih_end)
+           endif
+           iter=iter+1
+           if(iter.lt.10) then
+            call check_old(icheck,index)
+            if(icheck.eq.1) then 
+              index=index-1
+              ifused(iif)=.false. 
+              goto 94
+            endif
+           endif
+
+
+  911     continue
+
+         enddo
+       enddo
+
+      endif
+
+!-----------------------------------------
+! N7 : copy nonlocal beta fragment from bank to seed
+!
+      if (n7.gt.0) then 
+       if (n7frag.lt.n7) then 
+          write (iout,*) "N7: only ",n7frag,'nonlocal fragments'
+          n7c=n7frag
+       else
+          n7c=n7
+       endif
+
+       do i=1,nres
+         do j=1,mxio2
+            iff_in(i,j)=0
+         enddo
+       enddo
+       index2=0
+       do i=1,mxio
+         isend2(i)=0
+       enddo
+
+       do iters=1,nseed
+         iseed=is(iters)
+         do i=1,mxio
+           ifused(i)=.false.
+         enddo
+
+         do idummy=1,n7c
+           iran=0
+           iif=iran_num(1,n7frag)
+           do while( (ifused(iif) .or. bvar_frag(iif,1).eq.iseed) .and. &
+                            iran.le.mxio )
+            iif=iran_num(1,n7frag)
+            iran=iran+1
+           enddo
+            
+!d       write (*,'(3i5,l,4i5)'),iters,idummy,iif,ifused(iif),
+!d     &                    bvar_frag(iif,1),iseed,iran,index2
+         
+           if(iran.ge.mxio) goto 999
+           if(index2.ge.mxio2) goto 999 
+
+           index=index+1
+           movenx(index)=7
+           parent(1,index)=iseed
+           parent(2,index)=bvar_frag(iif,1)
+           index2=index2+1
+           isend2(index)=index2
+           ifused(iif)=.true.
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+           do k=1,numch
+            do j=2,nres-1
+             do i=1,4
+              dihang_in2(i,j,k,index2)=bvar(i,j,k,bvar_frag(iif,1))
+             enddo
+            enddo
+           enddo
+
+           if (bvar_frag(iif,2).eq.4) then                                                                  
+             do i=bvar_frag(iif,3),bvar_frag(iif,4)
+               iff_in(i,index2)=1                                                              
+             enddo                                                                   
+             if (bvar_frag(iif,5).lt.bvar_frag(iif,6)) then
+!d               print *,'###',bvar_frag(iif,3),bvar_frag(iif,4),
+!d     &                 bvar_frag(iif,5),bvar_frag(iif,6)
+               do i=bvar_frag(iif,5),bvar_frag(iif,6)
+                 iff_in(i,index2)=1                                                              
+               enddo                                                                   
+             else
+!d               print *,'###',bvar_frag(iif,3),bvar_frag(iif,4),
+!d     &                 bvar_frag(iif,6),bvar_frag(iif,5)
+               do i=bvar_frag(iif,6),bvar_frag(iif,5)
+                 iff_in(i,index2)=1                                                              
+               enddo                                                                   
+             endif
+           endif
+
+           do k=1,numch
+            do j=2,nres-1
+             do i=1,4
+              dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+             enddo
+            enddo
+           enddo
+
+
+  999     continue
+
+         enddo
+       enddo
+
+      endif
+!-----------------------------------------------
+! N6 : copy random continues fragment from bank to seed
+!
+      do iters=1,nseed
+       iseed=is(iters)
+       do idummy=1,n6
+        isize=(is2-is1+1)*ran1(idum)+is1
+        index=index+1
+        movenx(index)=6
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+        iter=0
+  104   continue
+        if(icycle.le.0) then
+         i1=nconf*  ran1(idum)+1
+         i1=nbank-nconf+i1
+        else
+         i1=nbank*  ran1(idum)+1
+        endif
+        if(i1.eq.iseed) goto 104
+        iter=iter+1
+        call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize)
+        parent(1,index)=iseed
+        parent(2,index)=i1
+        if(iter.lt.10) then
+         call check_old(icheck,index)
+         if(icheck.eq.1) goto 104
+        endif
+       enddo
+      enddo
+!-----------------------------------------
+      if (n3.gt.0.or.n4.gt.0) call gen_hairpin
+      nconf_harp=0
+      do iters=1,nseed
+        if (nharp_seed(iters).gt.0) nconf_harp=nconf_harp+1
+      enddo      
+!-----------------------------------------
+! N3 : copy hairpin from bank to seed
+!
+      do iters=1,nseed
+       iseed=is(iters)
+       nsucc=0
+       nacc=0
+       do idummy=1,n3
+        index=index+1
+        iter=0
+  124   continue
+        if(icycle.le.0) then
+         i1=nconf*  ran1(idum)+1
+         i1=nbank-nconf+i1
+        else
+         i1=nbank*  ran1(idum)+1
+        endif
+        if(i1.eq.iseed) goto 124
+        do k=1,nsucc
+          if (i1.eq.iisucc(k).and.nsucc.lt.nconf_harp-1) goto 124
+        enddo
+        nsucc=nsucc+1
+        iisucc(nsucc)=i1
+        iter=iter+1
+        call newconf_residue_hairpin(idum,dihang_in(1,1,1,index),&
+           i1,fail)
+        if (fail) then
+          if (icycle.le.0 .and. nsucc.eq.nconf .or. &
+              icycle.gt.0 .and. nsucc.eq.nbank)  then
+            index=index-1
+            goto 125
+          else
+            goto 124
+          endif
+        endif
+        if(iter.lt.10) then
+         call check_old(icheck,index)
+         if(icheck.eq.1) goto 124
+        endif
+        movenx(index)=3
+        parent(1,index)=iseed
+        parent(2,index)=i1
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+        nacc=nacc+1
+       enddo
+! if not enough hairpins, supplement with windows
+  125  continue
+!dd       if (n3.ne.0) write (iout,*) "N3",n3," nsucc",nsucc," nacc",nacc 
+       do idummy=nacc+1,n3
+        isize=(is2-is1+1)*ran1(idum)+is1
+        index=index+1
+        movenx(index)=6
+        parent(1,index)=iseed
+        parent(2,index)=i1
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+        iter=0
+  114   continue
+        if(icycle.le.0) then
+         i1=nconf*  ran1(idum)+1
+         i1=nbank-nconf+i1
+        else
+         i1=nbank*  ran1(idum)+1
+        endif
+        if(i1.eq.iseed) goto 114
+        iter=iter+1
+        call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize)
+        if(iter.lt.10) then
+         call check_old(icheck,index)
+         if(icheck.eq.1) goto 114
+        endif
+       enddo
+      enddo
+!-----------------------------------------
+! N4 : shift a turn in hairpin in seed
+!
+      IF (N4.GT.0) THEN
+      if (4*nharp_tot .ge. n4*nseed) then
+        ntot_gen=n4*nseed
+      else
+        ntot_gen=(4*nharp_tot/nseed)*nseed
+      endif
+      ngen=0
+      do while (ngen.lt.ntot_gen)
+      do iters=1,nseed
+        iseed=is(iters)
+!        write (iout,*) 'iters',iters,' iseed',iseed,' nharp_seed',
+!     &     nharp_seed(iters),' nharp_use',nharp_use(iters),
+!     &     ' ntot_gen',ntot_gen
+!        write (iout,*) 'iharp_use(0)',
+!     &     (iharp_use(0,k,iters),k=1,nharp_seed(iters))
+        if (nharp_use(iters).gt.0) then
+          nicht_getan=.true.
+          do while (nicht_getan)
+            iih=iran_num(1,nharp_seed(iters))
+!            write (iout,*) 'iih',iih,' iharp_use',
+!     &            (iharp_use(k,iih,iters),k=1,4)
+            if (iharp_use(0,iih,iters).gt.0) then
+              nicht_getan1=.true.
+              do while (nicht_getan1)
+                iim=iran_num(1,4)
+                nicht_getan1=iharp_use(iim,iih,iters).eq.1
+              enddo
+              nicht_getan=.false.
+              iharp_use(iim,iih,iters)=1
+              iharp_use(0,iih,iters)=iharp_use(0,iih,iters)-1 
+              nharp_use(iters)=nharp_use(iters)-1
+!dd              write (iout,'(a16,i3,a5,i2,a10,2i4)') 
+!dd     &           'N4 selected hairpin',iih,' move',iim,' iharp_seed',
+!dd     &            iharp_seed(1,iih,iters),iharp_seed(2,iih,iters)
+            endif
+          enddo
+          ngen=ngen+1
+          index=index+1
+          movenx(index)=4
+          parent(1,index)=iseed
+          parent(2,index)=0
+
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+          do k=1,numch
+            do j=2,nres-1
+              do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+              enddo
+            enddo
+          enddo
+          jstart=iharp_seed(1,iih,iters)+1
+          jend=iharp_seed(2,iih,iters)
+          if (iim.eq.1) then
+            ishift=-2
+          else if (iim.eq.2) then
+            ishift=-1
+          else if (iim.eq.3) then
+            ishift=1
+          else if (iim.eq.4) then
+            ishift=2
+          else
+            write (iout,*) 'CHUJ NASTAPIL: iim=',iim
+#ifdef MPI !el
+            call mpi_abort(mpi_comm_world,ierror,ierrcode)
+#endif !el
+          endif
+!          write (iout,*) 'jstart',jstart,' jend',jend,' ishift',ishift
+!          write (iout,*) 'Before turn shift'
+!          do j=2,nres-1
+!            theta(j+1)=dihang_in(1,j,1,index)
+!            phi(j+2)=dihang_in(2,j,1,index)
+!            alph(j)=dihang_in(3,j,1,index)
+!            omeg(j)=dihang_in(4,j,1,index)
+!          enddo
+!          call intout
+          do j=jstart,jend
+            if (itype(j).eq.10) then
+              iang=2
+            else
+              iang=4
+            endif
+            do i=1,iang
+              if (j+ishift.ge.nnt.and.j+ishift.le.nct) &
+                dihang_in(i,j+ishift,1,index)=bvar(i,j,1,iseed)
+            enddo
+          enddo
+!          write (iout,*) 'After turn shift'
+!          do j=2,nres-1
+!            theta(j+1)=dihang_in(1,j,1,index)
+!            phi(j+2)=dihang_in(2,j,1,index)
+!            alph(j)=dihang_in(3,j,1,index)
+!            omeg(j)=dihang_in(4,j,1,index)
+!          enddo
+!          call intout
+          if (ngen.eq.ntot_gen) goto 135
+        endif
+      enddo
+      enddo
+! if not enough hairpins, supplement with windows
+!      write (iout,*) 'end of enddo'
+  135 continue
+!dd      write (iout,*) "N4",n4," ngen/nseed",ngen/nseed,
+!dd     &                           ngen,nseed
+      do iters=1,nseed
+        iseed=is(iters)
+        do idummy=ngen/nseed+1,n4
+          isize=(is2-is1+1)*ran1(idum)+is1
+          index=index+1
+          movenx(index)=6
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+
+          iter=0
+  134     continue
+          if(icycle.le.0) then
+          i1=nconf*  ran1(idum)+1
+          i1=nbank-nconf+i1
+          else
+            i1=nbank*  ran1(idum)+1
+          endif
+          if(i1.eq.iseed) goto 134
+            iter=iter+1
+            call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize)
+            parent(1,index)=iseed
+            parent(2,index)=i1
+            if(iter.lt.10) then
+              call check_old(icheck,index)
+            if(icheck.eq.1) goto 134
+          endif
+        enddo
+      enddo
+      ENDIF
+!-----------------------------------------
+! N5 : copy one residue from bank to seed (normally switched off - use N1)
+!
+      do iters=1,nseed
+       iseed=is(iters)
+       isize=1
+       do i=1,n5
+        index=index+1
+        movenx(index)=5
+
+           if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+           endif
+
+
+        iter=0
+  105   continue
+        if(icycle.le.0) then
+         i1=nconf*  ran1(idum)+1
+         i1=nbank-nconf+i1
+        else
+         i1=nbank*  ran1(idum)+1
+        endif
+        if(i1.eq.iseed) goto 105
+        iter=iter+1
+        call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize)
+        parent(1,index)=iseed
+        parent(2,index)=i1
+        if(iter.lt.10) then
+         call check_old(icheck,index)
+         if(icheck.eq.1) goto 105
+        endif
+       enddo
+      enddo
+!-----------------------------------------
+! N2 : copy backbone of one residue from bank or first bank to seed
+! (normally switched off - use N1)
+!
+      do iters=1,nseed
+       iseed=is(iters)
+       do i=n2,1,-1
+        if(icycle.le.0.and.iuse.gt.nconf-irr) then
+         iseed=ran1(idum)*nconf+1
+         iseed=nbank-nconf+iseed
+        endif
+        index=index+1
+        movenx(index)=2
+
+        if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+        endif
+
+        iter=0
+  102   i1=  ran1(idum)*nbank+1
+        if(i1.eq.iseed) goto 102
+        iter=iter+1
+        if(icycle.le.0.and.iuse.gt.nconf-irr) then
+         nran=mod(i-1,nran0)+3
+         call newconf1arr(idum,dihang_in(1,1,1,index),nran,i1)
+         parent(1,index)=-iseed
+         parent(2,index)=-i1
+        else if(icycle.le.0.and.iters.le.iuse) then
+         nran=mod(i-1,nran0)+1
+         call newconf1abr(idum,dihang_in(1,1,1,index),nran,i1)
+         parent(1,index)=iseed
+         parent(2,index)=-i1
+        else
+         nran=mod(i-1,nran1)+1
+         if(ran1(idum).lt.0.5) then
+          call newconf1abr(idum,dihang_in(1,1,1,index),nran,i1)
+          parent(1,index)=iseed
+          parent(2,index)=-i1
+         else
+          call newconf1abb(idum,dihang_in(1,1,1,index),nran,i1)
+          parent(1,index)=iseed
+          parent(2,index)=i1
+         endif
+        endif
+        if(iter.lt.10) then
+         call check_old(icheck,index)
+         if(icheck.eq.1) goto 102
+        endif
+       enddo
+      enddo
+!-----------------------------------------
+! N1 : copy backbone or sidechain of one residue from bank or 
+!      first bank to seed
+!
+      do iters=1,nseed
+       iseed=is(iters)
+       do i=n1,1,-1
+        if(icycle.le.0.and.iuse.gt.nconf-irr) then
+         iseed=ran1(idum)*nconf+1
+         iseed=nbank-nconf+iseed
+        endif
+        index=index+1
+        movenx(index)=1
+
+        if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+        endif
+
+        iter=0
+  101   i1=  ran1(idum)*nbank+1
+
+        if(i1.eq.iseed) goto 101
+        iter=iter+1
+        if(icycle.le.0.and.iuse.gt.nconf-irr) then
+         nran=mod(i-1,nran0)+3
+         call newconf1rr(idum,dihang_in(1,1,1,index),nran,i1)
+         parent(1,index)=-iseed
+         parent(2,index)=-i1
+        else if(icycle.le.0.and.iters.le.iuse) then
+         nran=mod(i-1,nran0)+1
+         call newconf1br(idum,dihang_in(1,1,1,index),nran,i1)
+         parent(1,index)=iseed
+         parent(2,index)=-i1
+        else
+         nran=mod(i-1,nran1)+1
+         if(ran1(idum).lt.0.5) then
+          call newconf1br(idum,dihang_in(1,1,1,index),nran,i1)
+          parent(1,index)=iseed
+          parent(2,index)=-i1
+         else
+          call newconf1bb(idum,dihang_in(1,1,1,index),nran,i1)
+          parent(1,index)=iseed
+          parent(2,index)=i1
+         endif
+        endif
+        if(iter.lt.10) then
+         call check_old(icheck,index)
+         if(icheck.eq.1) goto 101
+        endif
+       enddo
+      enddo
+!-----------------------------------------
+! N0 just all seeds
+!
+      IF (n0.gt.0) THEN
+      do iters=1,nseed
+       iseed=is(iters)
+       index=index+1
+       movenx(index)=0
+       parent(1,index)=iseed
+       parent(2,index)=0
+
+       if (vdisulf) then
+             nss_in(index)=bvar_nss(iseed)
+             do ij=1,nss_in(index)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+       endif
+
+       do k=1,numch
+        do j=2,nres-1
+         do i=1,4
+          dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+         enddo
+        enddo
+       enddo
+      enddo
+      ENDIF
+!-----------------------------------------
+      if (vdisulf) then
+      do iters=1,nseed
+       iseed=is(iters)
+
+        do k=1,numch
+          do j=2,nres-1
+            theta(j+1)=bvar(1,j,k,iseed)
+            phi(j+2)=bvar(2,j,k,iseed)
+            alph(j)=bvar(3,j,k,iseed)
+            omeg(j)=bvar(4,j,k,iseed)
+          enddo
+        enddo
+        call chainbuild
+
+!d       write(iout,*) 'makevar DYNSS',iseed,'#',bvar_ns(iseed),
+!d     &     (bvar_s(k,iseed),k=1,bvar_ns(iseed)),
+!d     &     bvar_nss(iseed),
+!d     &     (bvar_ss(1,k,iseed)-nres,'-',
+!d     &      bvar_ss(2,k,iseed)-nres,k=1,bvar_nss(iseed))
+
+       do i1=1,bvar_ns(iseed)
+!
+! N10 fussion of free halfcysteines in seed 
+!      first select CYS with distance < 7A
+!
+         do j1=i1+1,bvar_ns(iseed)
+           if (dist(bvar_s(i1,iseed)+nres,bvar_s(j1,iseed)+nres) &
+               .lt.7.0.and. &
+               iabs(bvar_s(i1,iseed)-bvar_s(j1,iseed)).gt.3) then
+
+             index=index+1
+             movenx(index)=10
+             parent(1,index)=iseed
+             parent(2,index)=0
+             do ij=1,bvar_nss(iseed)
+               iss_in(ij,index)=bvar_ss(1,ij,iseed)
+               jss_in(ij,index)=bvar_ss(2,ij,iseed)
+             enddo
+             ij=bvar_nss(iseed)+1
+             nss_in(index)=ij
+             iss_in(ij,index)=bvar_s(i1,iseed)+nres
+             jss_in(ij,index)=bvar_s(j1,iseed)+nres
+
+!d             write(iout,*) 'makevar NSS0',index,
+!d     &   dist(bvar_s(i1,iseed)+nres,bvar_s(j1,iseed)+nres),
+!d     &   nss_in(index),iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres
+
+             do k=1,numch
+              do j=2,nres-1
+               do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+               enddo
+              enddo
+             enddo
+
+           endif
+         enddo
+!
+! N11 type I transdisulfidation
+!
+         do j1=1,bvar_nss(iseed)
+           if (dist(bvar_s(i1,iseed)+nres,bvar_ss(1,j1,iseed)) &
+               .lt.7.0.and. &
+               iabs(bvar_s(i1,iseed)-(bvar_ss(1,j1,iseed)-nres)) &
+               .gt.3) then
+
+             index=index+1
+             movenx(index)=11
+             parent(1,index)=iseed
+             parent(2,index)=0
+             do ij=1,bvar_nss(iseed)
+               if (ij.ne.j1) then
+                iss_in(ij,index)=bvar_ss(1,ij,iseed)
+                jss_in(ij,index)=bvar_ss(2,ij,iseed)
+               endif
+             enddo
+             nss_in(index)=bvar_nss(iseed)
+             iss_in(j1,index)=bvar_s(i1,iseed)+nres
+             jss_in(j1,index)=bvar_ss(1,j1,iseed)
+             if (iss_in(j1,index).gt.jss_in(j1,index)) then
+               iss_in(j1,index)=bvar_ss(1,j1,iseed)
+               jss_in(j1,index)=bvar_s(i1,iseed)+nres
+             endif
+
+!d             write(iout,*) 'makevar NSS1 #1',index,
+!d     &       bvar_s(i1,iseed),bvar_ss(1,j1,iseed)-nres,
+!d     &       dist(bvar_s(i1,iseed)+nres,bvar_ss(1,j1,iseed)),
+!d     &       (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres,
+!d     &       ij=1,nss_in(index))
+
+             do k=1,numch
+              do j=2,nres-1
+               do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+               enddo
+              enddo
+             enddo
+           endif
+           if (dist(bvar_s(i1,iseed)+nres,bvar_ss(2,j1,iseed)) &
+               .lt.7.0.and. &
+               iabs(bvar_s(i1,iseed)-(bvar_ss(2,j1,iseed)-nres)) &
+               .gt.3) then
+
+             index=index+1
+             movenx(index)=11
+             parent(1,index)=iseed
+             parent(2,index)=0
+             do ij=1,bvar_nss(iseed)
+               if (ij.ne.j1) then
+                iss_in(ij,index)=bvar_ss(1,ij,iseed)
+                jss_in(ij,index)=bvar_ss(2,ij,iseed)
+               endif
+             enddo
+             nss_in(index)=bvar_nss(iseed)
+             iss_in(j1,index)=bvar_s(i1,iseed)+nres
+             jss_in(j1,index)=bvar_ss(2,j1,iseed)
+             if (iss_in(j1,index).gt.jss_in(j1,index)) then
+               iss_in(j1,index)=bvar_ss(2,j1,iseed)
+               jss_in(j1,index)=bvar_s(i1,iseed)+nres
+             endif
+
+
+!d             write(iout,*) 'makevar NSS1 #2',index,
+!d     &       bvar_s(i1,iseed),bvar_ss(2,j1,iseed)-nres,
+!d     &       dist(bvar_s(i1,iseed)+nres,bvar_ss(2,j1,iseed)),
+!d     &       (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres,
+!d     &       ij=1,nss_in(index))
+
+             do k=1,numch
+              do j=2,nres-1
+               do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+               enddo
+              enddo
+             enddo
+
+           endif
+         enddo
+       enddo
+
+!
+! N12 type II transdisulfidation
+!
+       do i1=1,bvar_nss(iseed)
+         do j1=i1+1,bvar_nss(iseed)
+            if (dist(bvar_ss(1,i1,iseed),bvar_ss(1,j1,iseed)) &
+               .lt.7.0.and. &
+                dist(bvar_ss(2,i1,iseed),bvar_ss(2,j1,iseed)) &
+               .lt.7.0.and. &
+               iabs(bvar_ss(1,i1,iseed)-bvar_ss(1,j1,iseed)) &
+                .gt.3.and. &
+               iabs(bvar_ss(2,i1,iseed)-bvar_ss(2,j1,iseed)) &
+                .gt.3) then
+             index=index+1
+             movenx(index)=12
+             parent(1,index)=iseed
+             parent(2,index)=0
+             do ij=1,bvar_nss(iseed)
+               if (ij.ne.i1 .and. ij.ne.j1) then
+                iss_in(ij,index)=bvar_ss(1,ij,iseed)
+                jss_in(ij,index)=bvar_ss(2,ij,iseed)
+               endif
+             enddo
+             nss_in(index)=bvar_nss(iseed)
+             iss_in(i1,index)=bvar_ss(1,i1,iseed)
+             jss_in(i1,index)=bvar_ss(1,j1,iseed)
+             if (iss_in(i1,index).gt.jss_in(i1,index)) then
+               iss_in(i1,index)=bvar_ss(1,j1,iseed)
+               jss_in(i1,index)=bvar_ss(1,i1,iseed)
+             endif
+             iss_in(j1,index)=bvar_ss(2,i1,iseed)
+             jss_in(j1,index)=bvar_ss(2,j1,iseed)
+             if (iss_in(j1,index).gt.jss_in(j1,index)) then
+               iss_in(j1,index)=bvar_ss(2,j1,iseed)
+               jss_in(j1,index)=bvar_ss(2,i1,iseed)
+             endif
+
+
+!d             write(iout,*) 'makevar NSS2 #1',index,
+!d     &       bvar_ss(1,i1,iseed)-nres,bvar_ss(1,j1,iseed)-nres, 
+!d     &       dist(bvar_ss(1,i1,iseed),bvar_ss(1,j1,iseed)),
+!d     &       bvar_ss(2,i1,iseed)-nres,bvar_ss(2,j1,iseed)-nres,
+!d     &       dist(bvar_ss(2,i1,iseed),bvar_ss(2,j1,iseed)),
+!d     &       (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres,
+!d     &       ij=1,nss_in(index))
+
+             do k=1,numch
+              do j=2,nres-1
+               do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+               enddo
+              enddo
+             enddo
+
+           endif
+
+            if (dist(bvar_ss(1,i1,iseed),bvar_ss(2,j1,iseed)) &
+               .lt.7.0.and. &
+                dist(bvar_ss(2,i1,iseed),bvar_ss(1,j1,iseed)) &
+               .lt.7.0.and. &
+               iabs(bvar_ss(1,i1,iseed)-bvar_ss(2,j1,iseed)) &
+                .gt.3.and. &
+               iabs(bvar_ss(2,i1,iseed)-bvar_ss(1,j1,iseed)) &
+                .gt.3) then
+             index=index+1
+             movenx(index)=12
+             parent(1,index)=iseed
+             parent(2,index)=0
+             do ij=1,bvar_nss(iseed)
+               if (ij.ne.i1 .and. ij.ne.j1) then
+                iss_in(ij,index)=bvar_ss(1,ij,iseed)
+                jss_in(ij,index)=bvar_ss(2,ij,iseed)
+               endif
+             enddo
+             nss_in(index)=bvar_nss(iseed)
+             iss_in(i1,index)=bvar_ss(1,i1,iseed)
+             jss_in(i1,index)=bvar_ss(2,j1,iseed)
+             if (iss_in(i1,index).gt.jss_in(i1,index)) then
+               iss_in(i1,index)=bvar_ss(2,j1,iseed)
+               jss_in(i1,index)=bvar_ss(1,i1,iseed)
+             endif
+             iss_in(j1,index)=bvar_ss(2,i1,iseed)
+             jss_in(j1,index)=bvar_ss(1,j1,iseed)
+             if (iss_in(j1,index).gt.jss_in(j1,index)) then
+               iss_in(j1,index)=bvar_ss(1,j1,iseed)
+               jss_in(j1,index)=bvar_ss(2,i1,iseed)
+             endif
+
+
+!d             write(iout,*) 'makevar NSS2 #2',index,
+!d     &       bvar_ss(1,i1,iseed)-nres,bvar_ss(2,j1,iseed)-nres, 
+!d     &       dist(bvar_ss(1,i1,iseed),bvar_ss(2,j1,iseed)),
+!d     &       bvar_ss(2,i1,iseed)-nres,bvar_ss(1,j1,iseed)-nres,
+!d     &       dist(bvar_ss(2,i1,iseed),bvar_ss(1,j1,iseed)),
+!d     &       (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres,
+!d     &       ij=1,nss_in(index))
+
+             do k=1,numch
+              do j=2,nres-1
+               do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+               enddo
+              enddo
+             enddo
+
+           endif
+
+
+         enddo
+       enddo
+!
+! N13 removal of disulfide bond
+!
+      if (bvar_nss(iseed).gt.0) then
+        i1=bvar_nss(iseed)*ran1(idum)+1
+
+             index=index+1
+             movenx(index)=13
+             parent(1,index)=iseed
+             parent(2,index)=0
+             ij=0
+             do j1=1,bvar_nss(iseed)
+              if (j1.ne.i1) then
+               ij=ij+1
+               iss_in(ij,index)=bvar_ss(1,j1,iseed)
+               jss_in(ij,index)=bvar_ss(2,j1,iseed)
+              endif
+             enddo
+             nss_in(index)=bvar_nss(iseed)-1
+
+!d             write(iout,*) 'NSS3',index,i1,
+!d     &   bvar_ss(1,i1,iseed)-nres,'=',bvar_ss(2,i1,iseed)-nres,'#',
+!d     &   (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres,
+!d     &   ij=1,nss_in(index))
+
+             do k=1,numch
+              do j=2,nres-1
+               do i=1,4
+                dihang_in(i,j,k,index)=bvar(i,j,k,iseed)
+               enddo
+              enddo
+             enddo
+
+      endif
+
+      enddo
+      endif
+!-----------------------------------------
+
+
+
+      if(index.ne.n) write(iout,*)'make_var : ntry=',index
+
+      n=index
+!d      do ii=1,n
+!d        write (istat,*) "======== ii=",ii," the dihang array"
+!d        do i=1,nres
+!d       write (istat,'(i5,4f15.5)') i,(dihang_in(k,i,1,ii)*rad2deg,k=1,4)
+!d        enddo
+!d      enddo
+      return
+      end subroutine make_var
+!-----------------------------------------------------------------------------
+      subroutine check_old(icheck,n)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+      integer :: icheck,n,i1,i2,m,j,i
+      real(kind=8) :: ctdif,ctdiff,diff,dif
+
+      data ctdif /10./
+      data ctdiff /60./
+
+      i1=n
+      do i2=1,n-1
+       diff=0.d0
+       do m=1,numch
+        do j=2,nres-1
+         do i=1,4
+          dif=rad2deg*dabs(dihang_in(i,j,m,i1)-dihang_in(i,j,m,i2))
+          if(dif.gt.180.0) dif=360.0-dif
+          if(dif.gt.ctdif) goto 100
+          diff=diff+dif
+          if(diff.gt.ctdiff) goto 100
+         enddo
+        enddo
+       enddo
+       icheck=1
+       return
+  100  continue
+      enddo
+
+      icheck=0
+
+      return
+      end subroutine check_old
+!-----------------------------------------------------------------------------
+      subroutine newconf1rr(idum,vvar,nran,i1)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,nran,i1,iran,index,number,iter,ind
+      real(kind=8) :: ctdif,dif
+
+      ctdif=10.
+
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=rvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+      do index=1,nran
+       iold(index) = 0
+      enddo
+
+      number=ntotgr
+
+      iter=0
+      do index=1,nran
+   10  iran=  ran1(idum)*number+1
+       if(iter.gt.number) return
+       iter=iter+1
+       if(iter.eq.1) goto 11
+       do ind=1,index-1
+        if(iran.eq.iold(ind)) goto 10
+       enddo
+   11  continue
+
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1))
+        if(dif.gt.180.) dif=360.-dif
+        if(dif.gt.ctdif) goto 20
+       enddo
+       if(iter.gt.number) goto 20
+       goto 10
+   20  continue
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        vvar(i,j,k)=rvar(i,j,k,i1)
+       enddo
+       iold(index)=iran
+      enddo
+
+      return
+      end subroutine newconf1rr
+!-----------------------------------------------------------------------------
+      subroutine newconf1br(idum,vvar,nran,i1)
+
+      use energy_data, only: ndih_nconstr,idih_nconstr
+      use control_data, only: i2ndstr
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.TORCNSTR'
+!      include 'COMMON.CONTROL'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,nran,i1,iran,index,number,iter,juhc,ind
+      real(kind=8) :: ctdif,dif,rtmp
+
+      ctdif=10.
+
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+      do index=1,nran
+       iold(index) = 0
+      enddo
+
+      number=ntotgr
+
+      iter=0
+      do index=1,nran
+   10  iran=  ran1(idum)*number+1
+       if(i2ndstr.gt.0) then
+        rtmp=ran1(idum)
+        if(rtmp.le.rdih_bias) then
+         i=0
+         do j=1,ndih_nconstr
+          if(igroup(2,1,iran).eq.idih_nconstr(j))i=j
+         enddo
+         if(i.eq.0) then
+          juhc=0
+4321      juhc=juhc+1
+          iran=  ran1(idum)*number+1
+          i=0
+          do j=1,ndih_nconstr
+           if(igroup(2,1,iran).eq.idih_nconstr(j))i=j
+          enddo
+          if(i.eq.0.or.juhc.lt.1000)goto 4321
+          if(juhc.eq.1000) then
+           print *, 'move 6 : failed to find unconstrained group'
+           write(iout,*) 'move 6 : failed to find unconstrained group'
+          endif
+         endif
+        endif
+       endif
+       if(iter.gt.number) return
+       iter=iter+1
+       if(iter.eq.1) goto 11
+       do ind=1,index-1
+        if(iran.eq.iold(ind)) goto 10
+       enddo
+   11  continue
+
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1))
+        if(dif.gt.180.) dif=360.-dif
+        if(dif.gt.ctdif) goto 20
+       enddo
+       if(iter.gt.number) goto 20
+       goto 10
+   20  continue
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        vvar(i,j,k)=rvar(i,j,k,i1)
+       enddo
+       iold(index)=iran
+      enddo
+
+      return
+      end subroutine newconf1br
+!-----------------------------------------------------------------------------
+      subroutine newconf1bb(idum,vvar,nran,i1)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,nran,i1,iran,index,number,iter,ind
+      real(kind=8) :: ctdif,dif
+
+      ctdif=10.
+
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+      do index=1,nran
+       iold(index) = 0
+      enddo
+
+      number=ntotgr
+
+      iter=0
+      do index=1,nran
+   10  iran=  ran1(idum)*number+1
+       if(iter.gt.number) return
+       iter=iter+1
+       if(iter.eq.1) goto 11
+       do ind=1,index-1
+        if(iran.eq.iold(ind)) goto 10
+       enddo
+   11  continue
+
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1))
+        if(dif.gt.180.) dif=360.-dif
+        if(dif.gt.ctdif) goto 20
+       enddo
+       if(iter.gt.number) goto 20
+       goto 10
+   20  continue
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        vvar(i,j,k)=bvar(i,j,k,i1)
+       enddo
+       iold(index)=iran
+      enddo
+
+      return
+      end subroutine newconf1bb
+!-----------------------------------------------------------------------------
+      subroutine newconf1arr(idum,vvar,nran,i1)
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,nran,i1,iran,index,number,iter,ind
+      real(kind=8) :: ctdif,dif
+
+      ctdif=10.
+
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=rvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+      do index=1,nran
+       iold(index) = 0
+      enddo
+
+      number=nres-2
+
+      iter=0
+      do index=1,nran
+   10  iran=  ran1(idum)*number+1
+       if(iter.gt.number) return
+       iter=iter+1
+       if(iter.eq.1) goto 11
+       do ind=1,index-1
+        if(iran.eq.iold(ind)) goto 10
+       enddo
+   11  continue
+
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1))
+        if(dif.gt.180.) dif=360.-dif
+        if(dif.gt.ctdif) goto 20
+       enddo
+       if(iter.gt.number) goto 20
+       goto 10
+   20  continue
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        vvar(i,j,k)=rvar(i,j,k,i1)
+       enddo
+       iold(index)=iran
+      enddo
+
+      return
+      end subroutine newconf1arr
+!-----------------------------------------------------------------------------
+      subroutine newconf1abr(idum,vvar,nran,i1)
+
+      use energy_data, only: ndih_nconstr,idih_nconstr
+      use control_data, only: i2ndstr
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.TORCNSTR'
+!      include 'COMMON.CONTROL'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,nran,i1,iran,index,number,iter,ind
+      real(kind=8) :: ctdif,dif,rtmp
+
+      ctdif=10.
+
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+      do index=1,nran
+       iold(index) = 0
+      enddo
+
+      number=nres-2
+
+      iter=0
+      do index=1,nran
+   10  iran=  ran1(idum)*number+1
+      if(i2ndstr.gt.0) then
+       rtmp=ran1(idum)
+       if(rtmp.le.rdih_bias) then
+        iran=ran1(idum)*ndih_nconstr+1
+        iran=idih_nconstr(iran)
+       endif
+      endif
+       if(iter.gt.number) return
+       iter=iter+1
+       if(iter.eq.1) goto 11
+       do ind=1,index-1
+        if(iran.eq.iold(ind)) goto 10
+       enddo
+   11  continue
+
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1))
+        if(dif.gt.180.) dif=360.-dif
+        if(dif.gt.ctdif) goto 20
+       enddo
+       if(iter.gt.number) goto 20
+       goto 10
+   20  continue
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        vvar(i,j,k)=rvar(i,j,k,i1)
+       enddo
+       iold(index)=iran
+      enddo
+
+      return
+      end subroutine newconf1abr
+!-----------------------------------------------------------------------------
+      subroutine newconf1abb(idum,vvar,nran,i1)
+
+      use energy_data, only: ndih_nconstr,idih_nconstr
+      use control_data, only: i2ndstr
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.TORCNSTR'
+!      include 'COMMON.CONTROL'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,nran,i1,iran,index,number,iter,ind
+      real(kind=8) :: ctdif,dif,rtmp
+
+      ctdif=10.
+
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+      do index=1,nran
+       iold(index) = 0
+      enddo
+
+      number=nres-2
+
+      iter=0
+      do index=1,nran
+   10  iran=  ran1(idum)*number+1
+      if(i2ndstr.gt.0) then
+       rtmp=ran1(idum)
+       if(rtmp.le.rdih_bias) then
+        iran=ran1(idum)*ndih_nconstr+1
+        iran=idih_nconstr(iran)
+       endif
+      endif
+       if(iter.gt.number) return
+       iter=iter+1
+       if(iter.eq.1) goto 11
+       do ind=1,index-1
+        if(iran.eq.iold(ind)) goto 10
+       enddo
+   11  continue
+
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1))
+        if(dif.gt.180.) dif=360.-dif
+        if(dif.gt.ctdif) goto 20
+       enddo
+       if(iter.gt.number) goto 20
+       goto 10
+   20  continue
+       do ind=1,ngroup(iran)
+        i=igroup(1,ind,iran)
+        j=igroup(2,ind,iran)
+        k=igroup(3,ind,iran)
+        vvar(i,j,k)=bvar(i,j,k,i1)
+       enddo
+       iold(index)=iran
+      enddo
+
+      return
+      end subroutine newconf1abb
+!-----------------------------------------------------------------------------
+      subroutine newconf_residue(idum,vvar,i1,isize)
+
+      use energy_data, only: ndih_nconstr,idih_nconstr
+      use control_data, only: i2ndstr
+      use MPI_data
+      include 'mpif.h'
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.TORCNSTR'
+!      include 'COMMON.CONTROL'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,i1,isize,iran,number,iter,ind,iend,istart,&
+            ierror,ierrcode
+      real(kind=8) :: ctdif,dif,rtmp
+
+      ctdif=10.
+
+      if (iseed.gt.mxio .or. iseed.lt.1) then
+        write (iout,*) 'Dimension ERROR in NEWCONF: ISEED',iseed
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+
+      k=1
+      number=nres+isize-2
+      iter=1
+   10 iran=  ran1(idum)*number+1
+      if(i2ndstr.gt.0) then
+       rtmp=ran1(idum)
+       if(rtmp.le.rdih_bias) then
+        iran=ran1(idum)*ndih_nconstr+1
+        iran=idih_nconstr(iran)
+       endif
+      endif
+      istart=iran-isize+1
+      iend=iran
+      if(istart.lt.2) istart=2
+      if(iend.gt.nres-1) iend=nres-1
+
+      if(iter.eq.1) goto 11
+      do ind=1,iter-1
+       if(iran.eq.iold(ind)) goto 10
+      enddo
+   11 continue
+
+      do j=istart,iend
+       do i=1,4
+         dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1))
+         if(dif.gt.180.) dif=360.-dif
+         if(dif.gt.ctdif) goto 20
+       enddo
+      enddo
+      iold(iter)=iran
+      iter=iter+1
+      if(iter.gt.number) goto 20
+      goto 10
+
+   20 continue
+      do j=istart,iend
+       do i=1,4
+        vvar(i,j,k)=bvar(i,j,k,i1)
+       enddo
+      enddo
+
+      return
+      end subroutine newconf_residue
+!-----------------------------------------------------------------------------
+      subroutine newconf_copy(idum,vvar,i1,istart,iend)
+
+      use MPI_data
+      include 'mpif.h'
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.TORCNSTR'
+!      include 'COMMON.CONTROL'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: i,j,k,idum,i1,istart,iend,ierror,ierrcode
+      real(kind=8) :: ctdif,dif
+
+      ctdif=10.
+
+      if (iseed.gt.mxio .or. iseed.lt.1) then
+        write (iout,*) 'Dimension ERROR in NEWCONF: ISEED',iseed
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+
+
+      do j=istart,iend
+       do i=1,4
+        vvar(i,j,1)=bvar(i,j,1,i1)
+       enddo
+      enddo
+
+      return
+      end subroutine newconf_copy
+!-----------------------------------------------------------------------------
+      subroutine newconf_residue_hairpin(idum,vvar,i1,fail)
+
+      use geometry_data
+!      use random, only: iran_num
+      use MPI_data
+      use compare, only:hairpin
+     
+      include 'mpif.h'
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.VAR'
+!      real(kind=4) :: ran1,ran2
+      real(kind=8),dimension(mxang,nres,mxch) :: vvar  !(mxang,maxres,mxch)
+      integer,dimension(ntotal) :: iold
+      integer :: nharp,iharp(4,nres/3),icipa(nres/3)
+      logical :: fail,not_done
+      integer :: idum,i,j,k,i1,iend,istart,iii,n_used,icount,iih,&
+            ierror,ierrcode
+      real(kind=8) :: ctdif,dif
+
+      ctdif=10.
+
+      fail=.false.
+      if (iseed.gt.mxio .or. iseed.lt.1) then
+        write (iout,*) 'Dimension ERROR in NEWCONF: ISEED',iseed
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         vvar(i,j,k)=bvar(i,j,k,iseed)
+        enddo
+       enddo
+      enddo
+      do k=1,numch
+      do j=2,nres-1
+        theta(j+1)=bvar(1,j,k,i1)
+        phi(j+2)=bvar(2,j,k,i1)
+        alph(j)=bvar(3,j,k,i1)
+        omeg(j)=bvar(4,j,k,i1)
+      enddo
+      enddo
+!      call intout
+      call chainbuild
+      call hairpin(.false.,nharp,iharp)
+
+      if (nharp.eq.0) then
+        fail=.true.
+        return
+      endif
+
+      n_used=0
+
+      DO III=1,NHARP
+
+      not_done = .true.
+      icount=0
+      do while (not_done)
+        icount=icount+1
+        iih=iran_num(1,nharp)
+        do k=1,n_used
+          if (iih.eq.icipa(k)) then
+            iih=0
+            goto 22
+          endif
+        enddo
+        not_done=.false.
+        n_used=n_used+1
+        icipa(n_used)=iih
+   22   continue
+        not_done = not_done .and. icount.le.nharp
+      enddo
+
+      if (iih.eq.0) then
+        write (iout,*) "CHUJ NASTAPIL W NEWCONF_RESIDUE_HAIRPIN!!!!"
+        fail=.true.
+        return
+      endif
+      
+      istart=iharp(1,iih)+1
+      iend=iharp(2,iih)
+
+!dd      write (iout,*) "newconf_residue_hairpin: iih",iih,
+!dd     &   " istart",istart," iend",iend
+
+      do k=1,numch
+      do j=istart,iend
+       do i=1,4
+         dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1))
+         if(dif.gt.180.) dif=360.-dif
+         if(dif.gt.ctdif) goto 20
+       enddo
+      enddo
+      enddo
+      goto 10
+   20 continue
+      do k=1,numch
+      do j=istart,iend
+       do i=1,4
+        vvar(i,j,k)=bvar(i,j,k,i1)
+       enddo
+      enddo
+      enddo
+!      do j=1,numch
+!       do l=2,nres-1
+!        write (iout,'(4f8.3)') (rad2deg*vvar(i,l,j),i=1,4)
+!       enddo
+!      enddo
+      return
+   10 continue
+      ENDDO
+
+      fail=.true.
+
+      return
+      end subroutine newconf_residue_hairpin
+!-----------------------------------------------------------------------------
+      subroutine gen_hairpin
+
+      use geometry_data
+      use MD_data
+      use compare, only:hairpin
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.VAR'
+!      include 'COMMON.HAIRPIN'
+      integer :: i1,j,k,iters
+
+!      write (iout,*) 'Entering GEN_HAIRPIN'
+      do iters=1,nseed
+        i1=is(iters)
+        do k=1,numch
+          do j=2,nres-1
+            theta(j+1)=bvar(1,j,k,i1)
+            phi(j+2)=bvar(2,j,k,i1)
+            alph(j)=bvar(3,j,k,i1)
+            omeg(j)=bvar(4,j,k,i1)
+          enddo
+        enddo
+        call chainbuild
+        call hairpin(.false.,nharp_seed(iters),iharp_seed(1,1,iters))
+      enddo
+
+      nharp_tot=0
+      do iters=1,nseed
+        nharp_tot=nharp_tot+nharp_seed(iters)
+        nharp_use(iters)=4*nharp_seed(iters)
+        do j=1,nharp_seed(iters)
+          iharp_use(0,j,iters)=4
+          do k=1,4
+            iharp_use(k,j,iters)=0
+          enddo
+        enddo
+      enddo
+
+      write (iout,*) 'GEN_HAIRPIN: nharp_tot',nharp_tot
+!dd      do i=1,nseed
+!dd        write (iout,*) 'seed',i 
+!dd        write (iout,*) 'nharp_seed',nharp_seed(i),
+!dd     &     ' nharp_use',nharp_use(i)
+!d        write (iout,*) 'iharp_seed, iharp_use'
+!d        do j=1,nharp_seed(i)
+!d          write (iout,'(7i3)') iharp_seed(1,j,i),iharp_seed(2,j,i),
+!d     &      (iharp_use(k,j,i),k=0,4) 
+!d        enddo
+!dd      enddo
+      return
+      end subroutine gen_hairpin
+!-----------------------------------------------------------------------------
+      subroutine select_frag(nn,nh,nl,ns,nb,i_csa)
+
+      use geometry_data
+      use MD_data
+      use compare_data
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.GEO'
+!      include 'COMMON.VAR'
+!      include 'COMMON.HAIRPIN'
+!      include 'COMMON.DISTFIT'
+      character(len=50) :: linia
+      integer :: isec(nres)
+      integer :: i,j,i1,k,nn,nh,nl,ns,nb,i_csa,nl1,ns1
+
+      nn=0
+      nh=0
+      nl=0
+      ns=0
+      nb=0
+!d      write (iout,*) 'Entering select_frag'
+      do i1=1,nbank
+        do i=1,nres
+          isec(i)=0
+        enddo
+        do k=1,numch
+          do j=2,nres-1
+            theta(j+1)=bvar(1,j,k,i1)
+            phi(j+2)=bvar(2,j,k,i1)
+            alph(j)=bvar(3,j,k,i1)
+            omeg(j)=bvar(4,j,k,i1)
+          enddo
+        enddo
+        call chainbuild
+!d        write (iout,*) ' -- ',i1,' -- ' 
+        call secondary2(.false.)
+!
+! bvar_frag nn==pair of nonlocal strands in beta sheet (loop>4)
+!               strands > 4 residues; used by N7 and N16
+!
+        do j=1,nbfrag
+!
+!test 09/12/02 bfrag(2,j)-bfrag(1,j).gt.3
+!
+              do i=bfrag(1,j),bfrag(2,j)
+                isec(i)=1
+              enddo
+              do i=bfrag(4,j),bfrag(3,j),sign(1,bfrag(3,j)-bfrag(4,j))
+                isec(i)=1
+              enddo
+
+           if ( (bfrag(3,j).lt.bfrag(4,j) .or. &
+                bfrag(4,j)-bfrag(2,j).gt.4) .and. &
+                bfrag(2,j)-bfrag(1,j).gt.4 ) then
+             nn=nn+1
+
+
+             if (bfrag(3,j).lt.bfrag(4,j)) then
+               write(linia,'(a6,i3,a1,i3,a1,i3,a1,i3)') &
+                           "select",bfrag(1,j)-1,"-",bfrag(2,j)-1,&
+                                ",",bfrag(3,j)-1,"-",bfrag(4,j)-1
+             else
+               write(linia,'(a6,i3,a1,i3,a1,i3,a1,i3)') &
+                           "select",bfrag(1,j)-1,"-",bfrag(2,j)-1,&
+                                ",",bfrag(4,j)-1,"-",bfrag(3,j)-1
+
+             endif
+!d             call write_pdb(i_csa*1000+nn+nh,linia,0d0)
+
+             bvar_frag(nn,1)=i1
+             bvar_frag(nn,2)=4
+             do i=1,4
+               bvar_frag(nn,i+2)=bfrag(i,j)
+             enddo
+           endif
+        enddo
+
+!
+! hvar_frag nh==helices; used by N8 and N9
+!
+        do j=1,nhfrag
+
+              do i=hfrag(1,j),hfrag(2,j)
+                isec(i)=2
+              enddo
+
+          if ( hfrag(2,j)-hfrag(1,j).gt.4 ) then
+            nh=nh+1
+
+!d            write(linia,'(a6,i3,a1,i3)')
+!d     &                "select",hfrag(1,j)-1,"-",hfrag(2,j)-1
+!d            call write_pdb(i_csa*1000+nn+nh,linia,0d0)
+
+            hvar_frag(nh,1)=i1
+            hvar_frag(nh,2)=hfrag(1,j)
+            hvar_frag(nh,3)=hfrag(2,j)
+          endif
+        enddo
+
+        
+!v        write(iout,'(i4,1pe12.4,1x,1000i1)') 
+!v     &         i1,bene(i1),(isec(i),i=1,nres)
+!v            write(linia,'(i4,1x,1000i1)') 
+!v     &         i1,(isec(i),i=1,nres)
+!v            call write_pdb(i_csa*1000+i1,linia,bene(i1))
+!
+! lvar_frag nl==loops; used by N14
+!
+        i=1
+        nl1=nl
+        do while (i.lt.nres)
+          if (isec(i).eq.0) then
+           nl=nl+1
+           lvar_frag(nl,1)=i1
+           lvar_frag(nl,2)=i
+           i=i+1
+           do while (isec(i).eq.0.and.i.le.nres)
+             i=i+1
+           enddo
+           lvar_frag(nl,3)=i-1
+           if (lvar_frag(nl,3)-lvar_frag(nl,2).lt.1) nl=nl-1
+          endif
+          i=i+1
+        enddo
+!d        write(iout,'(4i5)') (i,(lvar_frag(i,ii),ii=1,3),i=nl1+1,nl)
+
+!
+! svar_frag ns==an secondary structure element; used by N15
+!
+        i=1
+        ns1=ns
+        do while (i.lt.nres)
+          if (isec(i).gt.0) then
+           ns=ns+1
+           svar_frag(ns,1)=i1
+           svar_frag(ns,2)=i
+           i=i+1
+           do while (isec(i).gt.0.and.isec(i-1).eq.isec(i) &
+                               .and.i.le.nres)
+             i=i+1
+           enddo
+           svar_frag(ns,3)=i-1
+           if (svar_frag(ns,3)-svar_frag(ns,2).lt.1) ns=ns-1
+          endif
+          if (isec(i).eq.0) i=i+1
+        enddo
+!d        write(iout,'(4i5)') (i,(svar_frag(i,ii),ii=1,3),i=ns1+1,ns)
+
+!
+! avar_frag nb==any pair of beta strands; used by N17
+!
+        do j=1,nbfrag
+             nb=nb+1
+             avar_frag(nb,1)=i1
+             do i=1,4
+               avar_frag(nb,i+1)=bfrag(i,j)
+             enddo
+        enddo
+
+      enddo
+
+      return
+      end subroutine select_frag
+!-----------------------------------------------------------------------------
+! together.F
+!-----------------------------------------------------------------------------
+      subroutine together
+
+!  feeds tasks for parallel processing
+      use MPI_data
+      use geometry_data
+      use control_data, only: vdisulf
+      use energy_data
+      use io, only:from_int,write_csa_pdb
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+      include 'mpif.h'
+!      real(kind=4) :: ran1,ran2
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.TIME1'
+!      include 'COMMON.SETUP'
+!      include 'COMMON.VAR'
+!      include 'COMMON.GEO'
+!      include 'COMMON.CONTROL'
+!      include 'COMMON.SBRIDGE'
+      real(kind=4) :: tcpu
+      real(kind=8) :: time_start,time_start_c,time0f,time0i
+      logical :: ovrtim,sync_iter,timeout,flag,timeout1
+      integer,dimension(mpi_status_size) :: muster
+      real(kind=8),dimension(0:100) :: t100
+      integer,dimension(mxio) :: indx
+      real(kind=8),dimension(6*nres) :: xout   !(maxvar) (maxvar=6*maxres)
+      real(kind=8),dimension(mxch*(mxch+1)/2+1) :: eout
+      integer,dimension(9) :: ind
+      real(kind=8),dimension(2) :: cout
+      real(kind=8),parameter :: rad=1.745329252d-2
+
+      integer :: i,m,j,jlee,nft,idum,nrmsdb,nrmsdb1,ierr,ierror,ierrcode,&
+            ntrial,ntry,idum2,imax,idumm,nconfr,iconf,mm,k,im,nst,ifar,&
+            iter,irecv,isent,iw_pdb,nft0i,nft00_c,nft00,ifrom,ij,&
+            ireq,ireq2
+      real(kind=8) :: adif,p_cut,cutdifr,rmsdbc1c,time1i,ctdif1,xctdif,&
+                 time2i,tstart,tend1
+!ccccccccccccccccccccccccccccccccccccccccccccccc
+      sync_iter=.true.   !el
+      nft=0    !el
+      time_start=0.0d0
+      IF (ME.EQ.KING) THEN
+
+       time0f=MPI_WTIME()
+       ilastnstep=1
+       sync_iter=.false.
+       numch=1
+       nrmsdb=0
+       nrmsdb1=0
+       rmsdbc1c=rmsdbc1
+       nstep=0
+       call csa_read
+       call make_array
+
+       if(iref.ne.0) call from_int(1,0,idum)
+
+! To minimize input conformation (bank conformation)
+! Output to $mol.reminimized
+       if (irestart.lt.0) then
+        call read_bank(0,nft,cutdifr)
+        if (irestart.lt.-10) then
+         p_cut=nres*4.d0
+         call prune_bank(p_cut)
+         return
+        endif
+        call reminimize(jlee)
+        return
+       endif
+
+       if (irestart.eq.0) then
+        call initial_write
+        nbank=nconf
+        ntbank=nconf
+        if (ntbankm.eq.0) ntbank=0
+        nstep=0
+        nft=0
+        do i=1,mxio
+         ibank(i)=0
+         jbank(i)=0
+        enddo
+       else
+        call restart_write
+!!bankt        call read_bankt(jlee,nft,cutdifr)
+        call read_bank(jlee,nft,cutdifr)
+        call read_rbank(jlee,adif)
+        if(iref.ne.0) call from_int(1,0,idum)
+       endif
+
+       nstmax=nstmax+nstep
+       ntrial=n1+n2+n3+n4+n5+n6+n7+n8
+       ntry=ntrial+1
+       ntry=ntry*nseed
+
+! ntrial : number of trial conformations per seed.
+! ntry : total number of trial conformations including seed conformations.
+
+       idum2=-123
+!       imax=2**31-1
+       imax=huge(0)
+       ENDIF
+
+       call mpi_bcast(jend,1,mpi_integer,0,CG_COMM,ierr)
+!ccccccccccccccccccccccccccccccccccccccc
+       do 300 jlee=1,jend
+!ccccccccccccccccccccccccccccccccccccccc
+  331   continue 
+        IF (ME.EQ.KING) THEN
+        if(sync_iter) goto 333
+        idum=-  ran2(idum2)*imax
+        if(jlee.lt.jstart) goto 300
+
+! Restart the random number generator for conformation generation
+
+        if(irestart.gt.0) then
+         idum2=idum2+nstep
+         if(idum2.le.0) idum2=-idum2+1
+         idum=-  ran2(idum2)*imax
+        endif
+
+        idumm=idum
+        call vrndst(idumm)
+
+        open(icsa_seed,file=csa_seed,status="old")
+        write(icsa_seed,*) "jlee : ",jlee
+        close(icsa_seed)
+
+      call history_append
+      write(icsa_history,*) "number of procs is ",nodes
+      write(icsa_history,*) jlee,idum,idum2
+      close(icsa_history)
+
+!ccccccccccccccccccccccccccccccccccccccccccccccc
+  333 icycle=0
+
+       call history_append
+        write(icsa_history,*) "nbank is ",nbank
+       close(icsa_history)
+
+      if(irestart.eq.1) goto 111
+      if(irestart.eq.2) then
+       icycle=0
+       do i=1,nbank
+        ibank(i)=1
+       enddo
+       do i=nbank+1,nbank+nconf
+        ibank(i)=0
+       enddo
+      endif
+
+!  start energy minimization
+      nconfr=max0(nconf+nadd,nodes-1)
+      if (sync_iter) nconf_in=0
+!  king-emperor - feed input and sort output
+       write (iout,*) "NCONF_IN",nconf_in
+       m=0
+       if (nconf_in.gt.0) then
+! al 7/2/00 - added possibility to read in some of the initial conformations
+        do m=1,nconf_in
+          read (intin,'(i5)',end=11,err=12) iconf
+   12     continue
+          write (iout,*) "write READ_ANGLES",iconf,m
+          call read_angles(intin,*11)
+          if (iref.eq.0) then
+            mm=m
+          else
+            mm=m+1
+          endif
+          do j=2,nres-1
+            dihang_in(1,j,1,mm)=theta(j+1)
+            dihang_in(2,j,1,mm)=phi(j+2)
+            dihang_in(3,j,1,mm)=alph(j)
+            dihang_in(4,j,1,mm)=omeg(j)
+          enddo
+        enddo ! m
+        goto 13
+   11   write (iout,*) nconf_in," conformations requested, but only",&
+         m-1," found in the angle file."
+        nconf_in=m-1
+   13   continue
+        m=nconf_in
+        write (iout,*) nconf_in,&
+          " initial conformations have been read in."
+       endif
+       if (iref.eq.0) then
+        if (nconfr.gt.nconf_in) then
+          call make_ranvar(nconfr,m,idum)
+          write (iout,*) nconfr-nconf_in,&
+           " conformations have been generated randomly."
+        endif
+       else
+        nconfr=nconfr*2
+        call from_int(nconfr,m,idum)
+!       call from_pdb(nconfr,idum)
+       endif
+       write (iout,*) 'Exitted from make_ranvar nconfr=',nconfr
+       write (*,*) 'Exitted from make_ranvar nconfr=',nconfr
+       do m=1,nconfr
+          write (iout,*) 'Initial conformation',m
+          write(iout,'(8f10.4)') (rad2deg*dihang_in(1,j,1,m),j=2,nres-1)
+          write(iout,'(8f10.4)') (rad2deg*dihang_in(2,j,1,m),j=2,nres-1)
+          write(iout,'(8f10.4)') (rad2deg*dihang_in(3,j,1,m),j=2,nres-1)
+          write(iout,'(8f10.4)') (rad2deg*dihang_in(4,j,1,m),j=2,nres-1)
+       enddo 
+       write(iout,*)'Calling FEEDIN NCONF',nconfr
+       time1i=MPI_WTIME()
+       call feedin(nconfr,nft)
+       write (iout,*) ' Time for first bank min.',MPI_WTIME()-time1i
+       call  history_append
+        write(icsa_history,*) jlee,nft,nbank
+        write(icsa_history,851) (etot(i),i=1,nconfr)
+        write(icsa_history,850) (rmsn(i),i=1,nconfr)
+        write(icsa_history,850) (pncn(i),i=1,nconfr)
+        write(icsa_history,*)
+       close(icsa_history)
+      ELSE
+! To minimize input conformation (bank conformation)
+! Output to $mol.reminimized   
+       if (irestart.lt.0) then 
+        call reminimize(jlee)
+        return
+       endif
+       if (irestart.eq.1) goto 111
+!  soldier - perform energy minimization
+ 334   call minim_jlee
+      ENDIF
+
+!cccccccccccccccccccccccccccccccccc
+! need to syncronize all procs
+      call mpi_barrier(CG_COMM,ierr)
+      if (ierr.ne.0) then
+       print *, ' cannot synchronize MPI'
+       stop
+      endif
+!cccccccccccccccccccccccccccccccccc
+
+      IF (ME.EQ.KING) THEN
+
+!      print *,"ok after minim"
+      nstep=nstep+nconf
+      if(irestart.eq.2) then
+       nbank=nbank+nconf
+!      ntbank=ntbank+nconf
+       if(ntbank.gt.ntbankm) ntbank=ntbankm
+      endif
+!      print *,"ok before indexx"
+      if(iref.eq.0) then
+       call indexx(nconfr,etot,indx)
+      else
+! cc/al 7/6/00
+       do k=1,nconfr
+         indx(k)=k
+       enddo
+       call indexx(nconfr-nconf_in,rmsn(nconf_in+1),indx(nconf_in+1))
+       do k=nconf_in+1,nconfr
+         indx(k)=indx(k)+nconf_in
+       enddo
+! cc/al
+!       call indexx(nconfr,rmsn,indx)
+      endif
+!      print *,"ok after indexx"
+      do im=1,nconf
+       m=indx(im)
+       if (m.gt.mxio .or. m.lt.1) then
+         write (iout,*) 'Dimension ERROR in TOGEHER: IM',im,' M',m
+         call mpi_abort(mpi_comm_world,ierror,ierrcode)
+       endif
+       jbank(im+nbank-nconf)=0
+       bene(im+nbank-nconf)=etot(m)
+       rene(im+nbank-nconf)=etot(m)
+!!bankt       btene(im)=etot(m)
+!
+       brmsn(im+nbank-nconf)=rmsn(m)
+       bpncn(im+nbank-nconf)=pncn(m)
+       rrmsn(im+nbank-nconf)=rmsn(m)
+       rpncn(im+nbank-nconf)=pncn(m)
+       if (im+nbank-nconf.gt.mxio .or. im+nbank-nconf.lt.1) then
+         write (iout,*) 'Dimension ERROR in TOGEHER: IM',im,&
+         ' NBANK',nbank,' NCONF',nconf,' IM+NBANK-NCONF',im+nbank-nconf
+         call mpi_abort(mpi_comm_world,ierror,ierrcode)
+       endif
+       do k=1,numch
+        do j=2,nres-1
+         do i=1,4
+          bvar(i,j,k,im+nbank-nconf)=dihang(i,j,k,m)
+          rvar(i,j,k,im+nbank-nconf)=dihang(i,j,k,m)
+!!bankt          btvar(i,j,k,im)=dihang(i,j,k,m)
+!
+         enddo
+        enddo
+       enddo
+       if(iref.eq.1) then
+        if(brmsn(im+nbank-nconf).gt.rmscut.or. &
+           bpncn(im+nbank-nconf).lt.pnccut) ibank(im+nbank-nconf)=9
+       endif
+       if(vdisulf) then
+           bvar_ns(im+nbank-nconf)=ns-2*nss
+           k=0
+           do i=1,ns
+             j=1
+             do while( iss(i).ne.ihpb(j)-nres .and. &
+                       iss(i).ne.jhpb(j)-nres .and. j.le.nss)
+              j=j+1 
+             enddo
+             if (j.gt.nss) then            
+               k=k+1
+               bvar_s(k,im+nbank-nconf)=iss(i)
+             endif
+           enddo
+       endif
+       bvar_nss(im+nbank-nconf)=nss
+       do i=1,nss
+           bvar_ss(1,i,im+nbank-nconf)=ihpb(i)
+           bvar_ss(2,i,im+nbank-nconf)=jhpb(i)
+       enddo
+      enddo
+      ENDIF
+
+  111 continue
+
+      IF (ME.EQ.KING) THEN
+
+      call find_max
+      call find_min
+
+      call get_diff
+      if(nbank.eq.nconf.and.irestart.eq.0) then
+       adif=avedif
+      endif
+
+      cutdif=adif/cut1
+      ctdif1=adif/cut2
+
+!d      print *,"adif,xctdif,cutdifr"
+!d      print *,adif,xctdif,cutdifr
+       nst=ntotal/ntrial/nseed
+       xctdif=(cutdif/ctdif1)**(-1.0/nst)
+       if(irestart.ge.1) call estimate_cutdif(adif,xctdif,cutdifr)
+!       print *,"ok after estimate"
+
+      irestart=0
+
+       call write_rbank(jlee,adif,nft)
+       call write_bank(jlee,nft)
+!!bankt       call write_bankt(jlee,nft)
+!       call write_bank1(jlee)
+       call  history_append
+        write(icsa_history,*) "xctdif: ", xctdif,nst,adif/cut1,ctdif1
+        write(icsa_history,851) (bene(i),i=1,nbank)
+        write(icsa_history,850) (brmsn(i),i=1,nbank)
+        write(icsa_history,850) (bpncn(i),i=1,nbank)
+        close(icsa_history)
+  850 format(10f8.3)
+  851 format(5e15.6)
+
+      ifar=nseed/4*3+1
+      ifar=nseed+1
+      ENDIF
+    
+
+      finished=.false.
+      iter = 0
+      irecv = 0
+      isent =0
+      ifrom= 0
+      time0i=MPI_WTIME()
+      time1i=time0i
+      time_start_c=time0i
+      if (.not.sync_iter) then 
+        time_start=time0i
+        nft00=nft
+      else
+        sync_iter=.false.
+      endif
+      nft00_c=nft
+      nft0i=nft
+
+!cccccccccccccccccccccccccccccccccccccc
+      do while (.not. finished)
+!cccccccccccccccccccccccccccccccccccccc
+!rc      print *,"iter ", iter,' isent=',isent
+
+      IF (ME.EQ.KING) THEN
+!  start energy minimization
+
+       if (isent.eq.0) then
+!  king-emperor - select seeds & make var & feed input
+!d        print *,'generating new conf',ntrial,MPI_WTIME()
+        call select_is(nseed,ifar,idum)
+
+        open(icsa_seed,file=csa_seed,status="old")
+        write(icsa_seed,39)  &
+          jlee,icycle,nstep,(is(i),bene(is(i)),i=1,nseed)
+        close(icsa_seed)
+        call  history_append
+        write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax,&
+         ebmin,ebmax,nft,iuse,nbank,ntbank
+        close(icsa_history)
+
+         
+
+        call make_var(ntry,idum,iter)
+!d        print *,'new trial generated',ntrial,MPI_WTIME()
+           time2i=MPI_WTIME()
+           write (iout,'(a20,i4,f12.2)') &
+             'Time for make trial',iter+1,time2i-time1i
+       endif
+
+!rc        write(iout,*)'1:Calling FEEDIN NTRY',NTRY,' ntrial',ntrial
+!rc        call feedin(ntry,nft)
+
+       isent=isent+1
+       if (isent.ge.nodes.or.iter.gt.0)  then
+!t            print *,'waiting ',MPI_WTIME()
+            irecv=irecv+1
+            call recv(0,ifrom,xout,eout,ind,timeout)
+!t            print *,'   ',irecv,' received from',ifrom,MPI_WTIME()
+       else
+            ifrom=ifrom+1
+       endif
+
+!t            print *,'sending to',ifrom,MPI_WTIME()
+       call send(isent,ifrom,iter)
+!t            print *,isent,' sent ',MPI_WTIME()
+
+! store results -----------------------------------------------
+       if (isent.ge.nodes.or.iter.gt.0)  then
+         nft=nft+ind(3)
+         movernx(irecv)=iabs(ind(5))
+         call getx(ind,xout,eout,cout,rad,iw_pdb,irecv)
+         if(vdisulf) then
+             nss_out(irecv)=nss
+             do i=1,nss
+               iss_out(i,irecv)=ihpb(i)
+               jss_out(i,irecv)=jhpb(i)  
+             enddo
+         endif
+         if(iw_pdb.gt.0) &
+                call write_csa_pdb(xout,eout,nft,irecv,iw_pdb)
+       endif
+!--------------------------------------------------------------
+       if (isent.eq.ntry) then
+           time1i=MPI_WTIME()
+           write (iout,'(a18,f12.2,a14,f10.2)') &
+             'Nonsetup time     ',time1i-time_start_c,&
+             ' sec, Eval/s =',(nft-nft00_c)/(time1i-time_start_c)
+           write (iout,'(a14,i4,f12.2,a14,f10.2)') &
+             'Time for iter ',iter+1,time1i-time0i,&
+             ' sec, Eval/s =',(nft-nft0i)/(time1i-time0i)
+           time0i=time1i
+           nft0i=nft
+           cutdif=cutdif*xctdif
+           if(cutdif.lt.ctdif1) cutdif=ctdif1
+           if (iter.eq.0) then
+              print *,'UPDATING ',ntry-nodes+1,irecv
+              write(iout,*) 'UPDATING ',ntry-nodes+1
+              iter=iter+1
+!----------------- call update(ntry-nodes+1) -------------------
+              nstep=nstep+ntry-nseed-(nodes-1)
+              call refresh_bank(ntry-nodes+1)
+!!bankt              call refresh_bankt(ntry-nodes+1)
+           else
+!----------------- call update(ntry) ---------------------------
+              iter=iter+1
+              print *,'UPDATING ',ntry,irecv
+              write(iout,*) 'UPDATING ',ntry
+              nstep=nstep+ntry-nseed
+              call refresh_bank(ntry)
+!!bankt              call refresh_bankt(ntry)
+           endif         
+!----------------------------------------------------------------- 
+
+           call write_bank(jlee,nft)
+!!bankt           call write_bankt(jlee,nft)
+           call find_min
+
+           time1i=MPI_WTIME()
+           write (iout,'(a20,i4,f12.2)') &
+             'Time for refresh ',iter,time1i-time0i
+
+           if(ebmin.lt.estop) finished=.true.
+           if(icycle.gt.icmax) then
+               call write_bank1(jlee)
+               do i=1,nbank
+                 ibank(i)=2
+                 ibank(i)=1
+               enddo
+               nbank=nbank+nconf
+               if(nbank.gt.1000) then 
+                   finished=.true.
+               else
+!rc                   goto 333
+                   sync_iter=.true.
+               endif
+           endif
+           if(nstep.gt.nstmax) finished=.true.
+
+           if(finished.or.sync_iter) then
+            do ij=1,nodes-1
+              call recv(1,ifrom,xout,eout,ind,timeout)
+              if (timeout) then
+                nstep=nstep+ij-1
+                print *,'ERROR worker is not responding'
+                write(iout,*) 'ERROR worker is not responding'
+                time1i=MPI_WTIME()-time_start_c
+                print *,'End of cycle, master time for ',iter,' iters ',&
+                   time1i,'sec, Eval/s ',(nft-nft00_c)/time1i
+                write (iout,*) 'End of cycle, master time for ',iter,&
+                   ' iters ',time1i,' sec'
+                write (iout,*) 'Total eval/s ',(nft-nft00_c)/time1i
+                print *,'UPDATING ',ij-1
+                write(iout,*) 'UPDATING ',ij-1
+                call flush(iout)
+                call refresh_bank(ij-1)
+!!bankt                call refresh_bankt(ij-1)
+                goto 1002
+              endif
+!              print *,'node ',ifrom,' finished ',ij,nft
+              write(iout,*) 'node ',ifrom,' finished ',ij,nft
+              call flush(iout)
+              nft=nft+ind(3)
+              movernx(ij)=iabs(ind(5))
+              call getx(ind,xout,eout,cout,rad,iw_pdb,ij)
+              if(vdisulf) then
+               nss_out(ij)=nss
+               do i=1,nss
+                 iss_out(i,ij)=ihpb(i)
+                 jss_out(i,ij)=jhpb(i)  
+               enddo
+              endif
+              if(iw_pdb.gt.0) &
+                call write_csa_pdb(xout,eout,nft,ij,iw_pdb)
+            enddo
+            nstep=nstep+nodes-1
+!rc            print *,'---------bcast finished--------',finished
+            time1i=MPI_WTIME()-time_start_c
+            print *,'End of cycle, master time for ',iter,' iters ',&
+                   time1i,'sec, Eval/s ',(nft-nft00_c)/time1i
+            write (iout,*) 'End of cycle, master time for ',iter,&
+                   ' iters ',time1i,' sec'
+            write (iout,*) 'Total eval/s ',(nft-nft00_c)/time1i
+
+!timeout            call mpi_bcast(finished,1,mpi_logical,0,CG_COMM,ierr)
+!timeout            call mpi_bcast(sync_iter,1,mpi_logical,0,
+!timeout     &                                              CG_COMM,ierr)
+            do ij=1,nodes-1 
+               tstart=MPI_WTIME()
+               call mpi_issend(finished,1,mpi_logical,ij,idchar,&
+                   CG_COMM,ireq,ierr)
+               call mpi_issend(sync_iter,1,mpi_logical,ij,idchar,&
+                   CG_COMM,ireq2,ierr)
+               flag=.false.  
+               timeout1=.false.
+               do while(.not. (flag .or. timeout1))
+                 call MPI_TEST(ireq2,flag,muster,ierr)
+                 tend1=MPI_WTIME()
+                 if(tend1-tstart.gt.60) then 
+                  print *,'ERROR worker ',ij,' is not responding'
+                  write(iout,*) 'ERROR worker ',ij,' is not responding'
+                  timeout1=.true.
+                 endif
+               enddo
+               if(timeout1) then
+                write(iout,*) 'worker ',ij,' NOT OK ',tend1-tstart
+                timeout=.true.
+               else
+                write(iout,*) 'worker ',ij,' OK ',tend1-tstart
+               endif
+            enddo
+            print *,'UPDATING ',nodes-1,ij
+            write(iout,*) 'UPDATING ',nodes-1
+            call refresh_bank(nodes-1)
+!!bankt            call refresh_bankt(nodes-1)
+ 1002       continue
+            call write_bank(jlee,nft)
+!!bankt            call write_bankt(jlee,nft)
+            call find_min
+
+            do i=0,mxmv  
+              do j=1,3
+                nstatnx_tot(i,j)=nstatnx_tot(i,j)+nstatnx(i,j)
+                nstatnx(i,j)=0
+              enddo
+            enddo
+
+            write(iout,*)'### Total stats:'
+            do i=0,mxmv
+             if(nstatnx_tot(i,1).ne.0) then
+              if (i.le.9) then
+              write(iout,'(a5,i1,a7,i6,a7,i4,a5,i4,a5,f5.1)') &
+              '### N',i,' total=',nstatnx_tot(i,1),&
+            ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3),'%acc',&
+             (nstatnx_tot(i,2)+nstatnx_tot(i,3))*100.0/nstatnx_tot(i,1)
+              else
+              write(iout,'(a4,i2,a7,i6,a7,i4,a5,i4,a5,f5.1)') &
+              '###N',i,' total=',nstatnx_tot(i,1),&
+            ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3),'%acc',&
+             (nstatnx_tot(i,2)+nstatnx_tot(i,3))*100.0/nstatnx_tot(i,1)
+              endif
+             else
+              if (i.le.9) then
+              write(iout,'(a5,i1,a7,i6,a7,i4,a5,i4,a5,f5.1)') &
+                '### N',i,' total=',nstatnx_tot(i,1),&
+                ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3),&
+                ' %acc',0.0
+              else
+              write(iout,'(a4,i2,a7,i6,a7,i4,a5,i4,a5,f5.1)') &
+                '###N',i,' total=',nstatnx_tot(i,1),&
+                ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3),&
+                ' %acc',0.0
+              endif
+             endif
+            enddo
+
+           endif
+           if(sync_iter) goto 331
+
+   39 format(2i3,i7,5(i4,f8.3,1x),19(/,13x,5(i4,f8.3,1x)))
+   40 format(2i2,i8,f8.1,2i4,2(1pe14.5),i10,3i4)
+   43 format(10i8)
+   44 format('jlee =',i3,':',4f10.1,' E =',f8.3,i7,i10)
+
+           isent=0
+           irecv=0
+       endif
+      ELSE
+!  soldier - perform energy minimization
+        call minim_jlee
+        print *,'End of minim, proc',me,'time ',MPI_WTIME()-time_start
+        write (iout,*) 'End of minim, proc',me,'time ',&
+                        MPI_WTIME()-time_start
+        call flush(iout)
+!timeout        call mpi_bcast(finished,1,mpi_logical,0,CG_COMM,ierr)
+!timeout        call mpi_bcast(sync_iter,1,mpi_logical,0,CG_COMM,ierr)
+         call mpi_recv(finished,1,mpi_logical,0,idchar,&
+                       CG_COMM,muster,ierr)             
+         call mpi_recv(sync_iter,1,mpi_logical,0,idchar,&
+                       CG_COMM,muster,ierr)             
+        if(sync_iter) goto 331
+      ENDIF
+
+!cccccccccccccccccccccccccccccccccccccc
+      enddo
+!cccccccccccccccccccccccccccccccccccccc
+
+      IF (ME.EQ.KING) THEN
+        call  history_append
+        write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax,&
+        ebmin,ebmax,nft,iuse,nbank,ntbank
+
+        write(icsa_history,44) jlee,0.0,0.0,0.0,&
+         0.0,ebmin,nstep,nft
+        write(icsa_history,*)
+       close(icsa_history)
+
+       time1i=MPI_WTIME()-time_start
+       print *,'End of RUN, master time ',&
+                   time1i,'sec, Eval/s ',(nft-nft00)/time1i
+       write (iout,*) 'End of RUN, master time  ',&
+                   time1i,' sec'
+       write (iout,*) 'Total eval/s ',(nft-nft00)/time1i
+
+       if(timeout) then 
+        write(iout,*) '!!!! ERROR worker was not responding'
+        write(iout,*) '!!!! cannot finish work normally'
+        write(iout,*) 'Processor0 is calling MPI_ABORT'
+        print *,'!!!! ERROR worker was not responding'
+        print *,'!!!! cannot finish work normally'
+        print *,'Processor0 is calling MPI_ABORT'
+        call flush(iout)
+        call mpi_abort(mpi_comm_world, 111, ierr)
+       endif
+      ENDIF
+
+!ccccccccccccccccccccccccccccc
+  300 continue
+!ccccccccccccccccccccccccccccc
+
+      return
+      end subroutine together
+!-----------------------------------------------------------------------------
+      subroutine feedin(nconf,nft)
+
+      use MPI_data
+      use geometry_data, only:nvar
+      use io, only:write_csa_pdb
+!  sends out starting conformations and receives results of energy minimization
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.VAR'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CONTROL'
+      include 'mpif.h'
+      real(kind=8),dimension(6*nres) :: xin,xout       !(maxvar) (maxvar=6*maxres)
+      real(kind=8),dimension(mxch*(mxch+1)/2+1) :: eout
+      real(kind=8),dimension(2) :: cout
+      integer,dimension(9) :: ind
+      integer,dimension(12) :: info
+      integer,dimension(mpi_status_size) :: muster
+!      include 'COMMON.SETUP'
+      real(kind=8),parameter :: rad=1.745329252d-2
+      integer :: j,nconf,nft,mm,n,ierror,ierrcode,ierr,iw_pdb,&
+            man
+
+      print *,'FEEDIN: NCONF=',nconf
+      mm=0
+!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+      if (nconf .lt. nodes-1) then
+        write (*,*) 'FATAL ERROR in FEEDIN, nconf < nodes -1',&
+         nconf,nodes-1 
+        write (iout,*) 'FATAL ERROR in FEEDIN, nconf < nodes -1',&
+         nconf,nodes-1 
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+      do n=1,nconf
+!  pull out external and internal variables for next start
+        call putx(xin,n,rad)
+!        write (iout,*) 'XIN from FEEDIN N=',n
+!        write(iout,'(8f10.4)') (xin(j),j=1,nvar)
+        mm=mm+1
+        if (mm.lt.nodes) then
+!  feed task to soldier
+!       print *, ' sending input for start # ',n
+         info(1)=n
+         info(2)=-1
+         info(3)=0
+         info(4)=0
+         info(5)=0
+         info(6)=0
+         call mpi_send(info,12,mpi_integer,mm,idint,CG_COMM,&
+                        ierr)
+         call mpi_send(xin,nvar,mpi_double_precision,mm,&
+                        idreal,CG_COMM,ierr)
+        else
+!  find an available soldier
+         call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint,&
+                       CG_COMM,muster,ierr)
+!        print *, ' receiving output from start # ',ind(1)
+         man=muster(mpi_source)
+!  receive final energies and variables
+         nft=nft+ind(3)
+         call mpi_recv(eout,1,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+!         print *,eout 
+#ifdef CO_BIAS
+         call mpi_recv(co,1,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+         write (iout,'(a15,f3.2,$)') ' BIAS by contact order*100 ',co
+#endif
+         call mpi_recv(xout,nvar,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+!         print *,nvar , ierr
+!  feed next task to soldier
+!        print *, ' sending input for start # ',n
+         info(1)=n
+         info(2)=-1
+         info(3)=0
+         info(4)=0
+         info(5)=0
+         info(6)=0
+         info(7)=0
+         info(8)=0
+         info(9)=0
+         call mpi_send(info,12,mpi_integer,man,idint,CG_COMM,&
+                        ierr)
+         call mpi_send(xin,nvar,mpi_double_precision,man,&
+                        idreal,CG_COMM,ierr)
+!  retrieve latest results
+         call getx(ind,xout,eout,cout,rad,iw_pdb,ind(1))
+         if(iw_pdb.gt.0) &
+              call write_csa_pdb(xout,eout,nft,ind(1),iw_pdb)
+        endif
+      enddo
+!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+!  no more input
+!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+      do j=1,nodes-1
+!  wait for a soldier
+       call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint,&
+                     CG_COMM,muster,ierr)
+!rc       if (ierr.ne.0) go to 30
+!      print *, ' receiving output from start # ',ind(1)
+       man=muster(mpi_source)
+!  receive final energies and variables
+       nft=nft+ind(3)
+       call mpi_recv(eout,1,&
+                     mpi_double_precision,man,idreal,&
+                     CG_COMM,muster,ierr)
+!       print *,eout
+#ifdef CO_BIAS
+         call mpi_recv(co,1,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+         write (iout,'(a15,f3.2,$)') ' BIAS by contact order*100 ',co
+#endif
+!rc       if (ierr.ne.0) go to 30
+       call mpi_recv(xout,nvar,mpi_double_precision,&
+                     man,idreal,CG_COMM,muster,ierr)
+!       print *,nvar , ierr
+!rc       if (ierr.ne.0) go to 30
+!  halt soldier
+       info(1)=0
+       info(2)=-1
+       info(3)=0 
+       info(4)=0
+       info(5)=0
+       info(6)=0
+       call mpi_send(info,12,mpi_integer,man,idint,CG_COMM,&
+                      ierr)
+!  retrieve results
+       call getx(ind,xout,eout,cout,rad,iw_pdb,ind(1))
+       if(iw_pdb.gt.0) &
+                call write_csa_pdb(xout,eout,nft,ind(1),iw_pdb)
+      enddo
+!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+      return
+   10 print *, ' dispatching error'
+      call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      return
+   20 print *, ' communication error'
+      call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      return
+   30 print *, ' receiving error'
+      call mpi_abort(mpi_comm_world,ierror,ierrcode)
+
+      return
+      end subroutine feedin
+!-----------------------------------------------------------------------------
+      subroutine getx(ind,xout,eout,cout,rad,iw_pdb,k)
+
+      use geometry_data
+      use energy_data
+      use compare, only: contact_fract
+      use MPI_data
+      include 'mpif.h'
+!  receives and stores data from soldiers
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.VAR'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.CONTACTS'
+      integer,dimension(9) :: ind
+      real(kind=8),dimension(6*nres) :: xout   !(maxvar) (maxvar=6*maxres)
+      real(kind=8),dimension(mxch*(mxch+1)/2+1) :: eout
+!jlee
+      real(kind=8) :: przes(3),obr(3,3),cout(2)
+      logical :: non_conv
+      integer :: iw_pdb,k,j,ierror,ierrcode
+      real(kind=8) :: rad,co
+!jlee
+      iw_pdb=2
+      if (k.gt.mxio .or. k.lt.1) then 
+        write (iout,*) &
+         'ERROR - dimensions of ANGMIN have been exceeded K=',k
+        call mpi_abort(mpi_comm_world,ierror,ierrcode)
+      endif
+!  store ind()
+      do j=1,9
+       indb(k,j)=ind(j)
+      enddo
+!  store energies
+      etot(k)=eout(1)
+!  retrieve dihedral angles etc
+      call var_to_geom(nvar,xout)
+      do j=2,nres-1
+        dihang(1,j,1,k)=theta(j+1)
+        dihang(2,j,1,k)=phi(j+2)
+        dihang(3,j,1,k)=alph(j)
+        dihang(4,j,1,k)=omeg(j)
+      enddo
+      dihang(2,nres-1,1,k)=0.0d0
+!jlee
+      if(iref.eq.0) then 
+       iw_pdb=1
+!d       write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4)') 
+!d     &      ind(2),' e ',ind(3),ind(1),' etot ',etot(k),' mv ',
+!d     &      ind(5),ind(4)
+       return
+      endif
+      call chainbuild
+!     call dihang_to_c(dihang(1,1,1,k))
+!     call fitsq(rms,c(1,1),crefjlee(1,1),nres,przes,obr,non_conv)
+!     call fitsq(rms,c(1,2),crefjlee(1,2),nres-1,przes,obr,non_conv)
+!           call fitsq(rms,c(1,nstart_seq),crefjlee(1,nstart_sup),
+!    &                 nsup,przes,obr,non_conv)
+!      rmsn(k)=dsqrt(rms)
+
+       call rmsd_csa(rmsn(k))
+       call contact(.false.,ncont,icont,co)
+       pncn(k)=contact_fract(ncont,ncont_ref,icont,icont_ref)     
+
+!d       write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a5
+!d     &      ,0pf5.2,a5,f5.1,a,f6.3,a4,i3,i4)') 
+!d     &    ind(2),' e ',ind(3),ind(1),' etot ',etot(k),' rms ',
+!d     &    rmsn(k),' %NC ',pncn(k)*100,' cont.order',co,' mv ',
+!d     &    ind(5),ind(4)
+
+      if (rmsn(k).gt.rmscut.or.pncn(k).lt.pnccut) iw_pdb=0
+      return
+      end subroutine getx
+!-----------------------------------------------------------------------------
+      subroutine putx(xin,n,rad)
+
+      use geometry_data
+!  gets starting variables
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.VAR'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.IOUNITS'
+      integer :: n,m,j
+      real(kind=8),dimension(6*nres) :: xin    !(maxvar) (maxvar=6*maxres)
+      real(kind=8) :: rad
+
+!  pull out starting values for variables
+!       write (iout,*)'PUTX: N=',n
+      do m=1,numch
+!        write (iout,'(8f10.4)') (dihang_in(1,j,m,n),j=2,nres-1)
+!        write (iout,'(8f10.4)') (dihang_in(2,j,m,n),j=2,nres-1)
+!        write (iout,'(8f10.4)') (dihang_in(3,j,m,n),j=2,nres-1)
+!        write (iout,'(8f10.4)') (dihang_in(4,j,m,n),j=2,nres-1)
+       do j=2,nres-1
+        theta(j+1)=dihang_in(1,j,m,n)
+        phi(j+2)=dihang_in(2,j,m,n)
+        alph(j)=dihang_in(3,j,m,n)
+        omeg(j)=dihang_in(4,j,m,n)
+       enddo
+      enddo
+!  set up array of variables
+      call geom_to_var(nvar,xin)
+!       write (iout,*) 'xin in PUTX N=',n 
+!       call intout
+!       write (iout,'(8f10.4)') (xin(i),i=1,nvar) 
+      return
+      end subroutine putx
+!-----------------------------------------------------------------------------
+      subroutine putx2(xin,iff,n)
+
+      use geometry_data
+!  gets starting variables
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.VAR'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.IOUNITS'
+      integer :: n,m,j,i
+      real(kind=8),dimension(6*nres) :: xin    !(maxvar) (maxvar=6*maxres)
+      integer,dimension(nres) :: iff   !(maxres)
+
+!  pull out starting values for variables
+      do m=1,numch
+       do j=2,nres-1
+        theta(j+1)=dihang_in2(1,j,m,n)
+        phi(j+2)=dihang_in2(2,j,m,n)
+        alph(j)=dihang_in2(3,j,m,n)
+        omeg(j)=dihang_in2(4,j,m,n)
+       enddo
+      enddo
+!  set up array of variables
+      call geom_to_var(nvar,xin)
+       
+      do i=1,nres
+        iff(i)=iff_in(i,n)
+      enddo
+      return
+      end subroutine putx2
+!-----------------------------------------------------------------------------
+      subroutine prune_bank(p_cut)
+
+      use MPI_data
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+      include 'mpif.h'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.TIME1'
+!      include 'COMMON.SETUP'
+      integer :: k,j,i,m,ip,nprune
+      real(kind=8) :: p_cut,diff,ddmin
+!---------------------------
+! This subroutine prunes bank conformations using p_cut
+!---------------------------
+
+      nprune=0
+      nprune=nprune+1
+      m=1
+      do k=1,numch
+       do j=2,nres-1
+        do i=1,4
+         dihang(i,j,k,nprune)=bvar(i,j,k,m)
+        enddo
+       enddo
+      enddo
+      bene(nprune)=bene(m)
+      brmsn(nprune)=brmsn(m)
+      bpncn(nprune)=bpncn(m) 
+
+      do m=2,nbank
+       ddmin=9.d190
+       do ip=1,nprune
+        call get_diff12(dihang(1,1,1,ip),bvar(1,1,1,m),diff) 
+        if(diff.lt.p_cut) goto 100
+        if(diff.lt.ddmin) ddmin=diff
+       enddo
+       nprune=nprune+1
+       do k=1,numch
+        do j=2,nres-1
+         do i=1,4
+          dihang(i,j,k,nprune)=bvar(i,j,k,m)
+         enddo
+        enddo
+       enddo
+       bene(nprune)=bene(m)
+       brmsn(nprune)=brmsn(m)
+       bpncn(nprune)=bpncn(m)
+  100  continue
+       write (iout,*) 'Pruning :',m,nprune,p_cut,ddmin
+      enddo
+      nbank=nprune
+      print *, 'Pruning :',m,nprune,p_cut
+      call write_bank(0,0)
+
+      return
+      end subroutine prune_bank
+!-----------------------------------------------------------------------------
+      subroutine reminimize(jlee)
+
+      use MPI_data
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+      include 'mpif.h'
+!      include 'COMMON.CSA'
+!      include 'COMMON.BANK'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.TIME1'
+!      include 'COMMON.SETUP'
+      integer :: i,j,k,jlee,index,nft,ntry
+!---------------------------
+! This subroutine re-minimizes bank conformations:
+!---------------------------
+
+       ntry=nbank
+
+       call find_max
+       call find_min
+
+       if (me.eq.king) then
+        open(icsa_history,file=csa_history,status="old")
+         write(icsa_history,*) "Re-minimization",nodes,"nodes"
+         write(icsa_history,851) (bene(i),i=1,nbank)
+         write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax,&
+          ebmin,ebmax,nft,iuse,nbank,ntbank
+        close(icsa_history)
+        do index=1,ntry
+         do k=1,numch
+          do j=2,nres-1
+           do i=1,4
+            dihang_in(i,j,k,index)=bvar(i,j,k,index)
+           enddo
+          enddo
+         enddo
+        enddo
+        nft=0
+        call feedin(ntry,nft)
+       else
+        call minim_jlee
+       endif
+
+       call find_max
+       call find_min
+
+       if (me.eq.king) then
+        do i=1,ntry
+         call replace_bvar(i,i)
+        enddo
+        open(icsa_history,file=csa_history,status="old")
+         write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax,&
+          ebmin,ebmax,nft,iuse,nbank,ntbank
+         write(icsa_history,851) (bene(i),i=1,nbank)
+        close(icsa_history)
+        call write_bank_reminimized(jlee,nft)
+       endif
+
+   40 format(2i2,i8,f8.1,2i4,2(1pe14.5),i10,3i4)
+  851 format(5e15.6)
+  850 format(5e15.10)
+!  850 format(10f8.3)
+
+      return
+      end subroutine reminimize
+!-----------------------------------------------------------------------------
+      subroutine send(n,mm,it)
+
+      use MPI_data
+      use geometry_data, only: nvar
+      use control_data, only: vdisulf
+!  sends out starting conformation for minimization
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.VAR'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CONTROL'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+      include 'mpif.h'
+      real(kind=8),dimension(6*nres) :: xin,xout,xin2  !(maxvar) (maxvar=6*maxres)
+      real(kind=8),dimension(mxch*(mxch+1)/2+1) :: eout
+      real(kind=8),dimension(2) :: cout
+      integer,dimension(9) :: ind
+      integer,dimension(nres) :: iff   !(maxres)
+      integer,dimension(12) :: info
+      integer,dimension(mpi_status_size) :: muster
+!      include 'COMMON.SETUP'
+      real(kind=8),parameter :: rad=1.745329252d-2
+      integer :: n,mm,it,ierr
+
+      if (isend2(n).eq.0) then
+!  pull out external and internal variables for next start
+        call putx(xin,n,rad)
+        info(1)=n
+        info(2)=it
+        info(3)=movenx(n)
+        info(4)=nss_in(n)
+        info(5)=parent(1,n)
+        info(6)=parent(2,n)
+
+        if (movenx(n).eq.14.or.movenx(n).eq.17) then
+          info(7)=idata(1,n)
+          info(8)=idata(2,n)
+        else if (movenx(n).eq.16) then
+          info(7)=idata(1,n)
+          info(8)=idata(2,n)
+          info(10)=idata(3,n)
+          info(11)=idata(4,n)
+          info(12)=idata(5,n)
+        else
+         info(7)=0
+         info(8)=0
+         info(10)=0
+         info(11)=0
+         info(12)=0
+        endif
+
+        if (movenx(n).eq.15) then
+         info(9)=parent(3,n)
+        else
+         info(9)=0
+        endif
+        call mpi_send(info,12,mpi_integer,mm,idint,CG_COMM,&
+                        ierr)
+        call mpi_send(xin,nvar,mpi_double_precision,mm,&
+                        idreal,CG_COMM,ierr)
+      else
+!  distfit & minimization for n7 move
+        info(1)=-n
+        info(2)=it
+        info(3)=movenx(n)
+        info(4)=nss_in(n)
+        info(5)=parent(1,n)
+        info(6)=parent(2,n)
+        info(7)=0
+        info(8)=0
+        info(9)=0
+        call mpi_send(info,12,mpi_integer,mm,idint,CG_COMM,&
+                        ierr)
+        call putx2(xin,iff,isend2(n))
+        call mpi_send(xin,nvar,mpi_double_precision,mm,&
+                        idreal,CG_COMM,ierr)
+        call mpi_send(iff,nres,mpi_integer,mm,&
+                        idint,CG_COMM,ierr)
+        call putx(xin2,n,rad)
+        call mpi_send(xin2,nvar,mpi_double_precision,mm,&
+                        idreal,CG_COMM,ierr)
+      endif 
+      if (vdisulf.and.nss_in(n).ne.0) then
+        call mpi_send(iss_in(1,n),nss_in(n),mpi_integer,mm,&
+                        idint,CG_COMM,ierr)
+        call mpi_send(jss_in(1,n),nss_in(n),mpi_integer,mm,&
+                        idint,CG_COMM,ierr)
+      endif
+      return
+      end subroutine send
+!-----------------------------------------------------------------------------
+      subroutine recv(ihalt,man,xout,eout,ind,tout)
+
+      use MPI_data
+      use energy_data
+      use geometry_data, only: nvar
+      use control_data, only: vdisulf
+!  receives results of energy minimization
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.VAR'
+!      include 'COMMON.IOUNITS'
+!      include 'COMMON.CONTROL'
+!      include 'COMMON.SBRIDGE'
+!      include 'COMMON.BANK'
+!      include 'COMMON.CHAIN'
+      include 'mpif.h'
+      real(kind=8),dimension(6*nres) :: xin,xout       !(maxvar) (maxvar=6*maxres)
+      real(kind=8),dimension(mxch*(mxch+1)/2+1) :: eout
+      real(kind=8),dimension(2) :: cout
+      integer,dimension(9) :: ind
+      integer,dimension(12) :: info
+      integer,dimension(mpi_status_size) :: muster
+!      include 'COMMON.SETUP'
+      logical :: tout,flag
+      real(kind=8) :: tstart,tend1
+      real(kind=8),parameter :: twait=600.0d0
+      integer :: ihalt,man,ierr
+
+!  find an available soldier
+       tout=.false.
+       flag=.false.
+       tstart=MPI_WTIME()
+       do while(.not. (flag .or. tout))
+         call MPI_IPROBE(mpi_any_source,idint,CG_COMM,flag, &
+                  muster,ierr)
+         tend1=MPI_WTIME()
+         if(tend1-tstart.gt.twait .and. ihalt.eq.1) tout=.true.
+!_error         if(tend1-tstart.gt.twait) tout=.true.
+       enddo
+       if (tout) then 
+         write(iout,*) 'ERROR = timeout for recv ',tend1-tstart
+         call flush(iout)
+         return
+       endif
+       man=muster(mpi_source)        
+
+!timeout         call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint,
+!timeout     *                 CG_COMM,muster,ierr)
+!        print *, ' receiving output from start # ',ind(1)
+!t         print *,'receiving ',MPI_WTIME()
+!timeout         man=muster(mpi_source)
+         call mpi_recv(ind,9,mpi_integer,man,idint,&
+                       CG_COMM,muster,ierr)
+!timeout
+!  receive final energies and variables
+         call mpi_recv(eout,1,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+!         print *,eout 
+#ifdef CO_BIAS
+         call mpi_recv(co,1,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+         write (iout,'(a15,f3.2,$)') ' BIAS by contact order*100 ',co
+#endif
+         call mpi_recv(xout,nvar,mpi_double_precision,&
+                       man,idreal,CG_COMM,muster,ierr)
+!         print *,nvar , ierr
+         if(vdisulf) nss=ind(6)
+         if(vdisulf.and.nss.ne.0) then
+          call mpi_recv(ihpb,nss,mpi_integer,&
+                       man,idint,CG_COMM,muster,ierr)         
+          call mpi_recv(jhpb,nss,mpi_integer,&
+                       man,idint,CG_COMM,muster,ierr)
+         endif
+!  halt soldier
+       if(ihalt.eq.1) then 
+!        print *,'sending halt to ',man
+        write(iout,*) 'sending halt to ',man
+        info(1)=0
+        call mpi_send(info,12,mpi_integer,man,idint,CG_COMM,ierr)
+       endif
+      return
+      end subroutine recv
+!-----------------------------------------------------------------------------
+      subroutine history_append
+
+!      implicit real*8 (a-h,o-z)
+!      include 'DIMENSIONS'
+!      include 'COMMON.IOUNITS'
+
+#if defined(AIX) || defined(PGI)
+       open(icsa_history,file=csa_history,position="append")
+#else
+       open(icsa_history,file=csa_history,access="append")
+#endif
+      return
+      end subroutine history_append
+!-----------------------------------------------------------------------------
+      subroutine alloc_CSA_arrays
+
+      use energy_data, only: ns
+
+      mxgr=2*nres
+
+      if(.not.allocated(bfrag)) allocate(bfrag(4,nres/3))
+! commom.bank
+!      common/varin/
+!el      allocate(dihang_in(mxang,nres,mxch,mxio)) !(mxang,maxres,mxch,mxio)
+      allocate(dihang_in(mxang,nres,mxch,5000)) !(mxang,maxres,mxch,mxio)
+      allocate(nss_in(mxio)) !(mxio)
+      allocate(iss_in(ns,mxio),jss_in(ns,mxio)) !(maxss,mxio)
+!      common/minvar/
+      allocate(dihang(mxang,nres,mxch,mxio)) !(mxang,maxres,mxch,mxio)
+      allocate(rmsn(mxio),pncn(mxio)) !(mxio)
+      allocate(etot(mxio)) !(mxio)
+      allocate(nss_out(mxio)) !(mxio)
+      allocate(iss_out(ns,mxio),jss_out(ns,mxio)) !(maxss,mxio)
+!      common/bank/
+      allocate(rvar(mxang,nres,mxch,mxio),bvar(mxang,nres,mxch,mxio)) !(mxang,maxres,mxch,mxio)
+      allocate(bene(mxio),rene(mxio),brmsn(mxio),rrmsn(mxio))
+      allocate(bpncn(mxio),rpncn(mxio)) !(mxio)
+      allocate(ibank(mxio),is(mxio),jbank(mxio)) !(mxio)
+      allocate(dij(mxio,mxio)) !(mxio,mxio)
+!      common/bank_disulfid/ 
+      allocate(bvar_nss(mxio),bvar_ns(mxio)) !(mxio)
+      allocate(bvar_s(ns,mxio)) !(maxss,mxio)
+      allocate(bvar_ss(2,ns,mxio)) !(2,maxss,mxio) 
+!      common/mvstat/
+      allocate(movenx(mxio),movernx(mxio)) !(mxio)
+      allocate(nstatnx(0:mxmv,3),nstatnx_tot(0:mxmv,3)) !(0:mxmv,3)
+      allocate(indb(mxio,9)) !(mxio,9)
+      allocate(parent(3,mxio)) !(3,mxio)
+!      common/send2/
+      allocate(isend2(mxio)) !(mxio)
+      allocate(iff_in(nres,mxio2)) !(maxres,mxio2)
+      allocate(dihang_in2(mxang,nres,mxch,mxio2)) !(mxang,maxres,mxch,mxio2)
+      allocate(idata(5,mxio)) !(5,mxio)
+! common.csa
+!      common/alphaa/
+      allocate(ngroup(mxgr)) !(mxgr)
+      allocate(igroup(3,mxang,mxgr)) !(3,mxang,mxgr)
+! common.distfit
+!      COMMON /frag/
+      allocate(bvar_frag(mxio,6)) !(mxio,6)
+      allocate(hvar_frag(mxio,3),lvar_frag(mxio,3),svar_frag(mxio,3)) !(mxio,3)
+      allocate(avar_frag(mxio,5)) !(mxio,5)
+! commom.hairpin
+!      common /spinka/
+      allocate(nharp_seed(nseed),nharp_use(nseed))     !(max_seed)
+      allocate(iharp_seed(4,nres/3,nseed))     !(4,maxres/3,max_seed)
+      allocate(iharp_use(0:4,nres/3,nseed))    !(0:4,maxres/3,max_seed)
+
+      return
+      end subroutine alloc_CSA_arrays
+!-----------------------------------------------------------------------------
+!-----------------------------------------------------------------------------
+      end module csa