--- /dev/null
+ subroutine mcm_setup
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.MCM'
+ include 'COMMON.CONTROL'
+ include 'COMMON.INTERACT'
+ include 'COMMON.NAMES'
+ include 'COMMON.CHAIN'
+ include 'COMMON.VAR'
+C
+C Set up variables used in MC/MCM.
+C
+ write (iout,'(80(1h*)/20x,a/80(1h*))') 'MCM control parameters:'
+ write (iout,'(5(a,i7))') 'Maxacc:',maxacc,' MaxTrial:',MaxTrial,
+ & ' MaxRepm:',MaxRepm,' MaxGen:',MaxGen,' MaxOverlap:',MaxOverlap
+ write (iout,'(4(a,f8.1)/2(a,i3))')
+ & 'Tmin:',Tmin,' Tmax:',Tmax,' TstepH:',TstepH,
+ & ' TstepC:',TstepC,'NstepH:',NstepH,' NstepC:',NstepC
+ if (nwindow.gt.0) then
+ write (iout,'(a)') 'Perturbation windows:'
+ do i=1,nwindow
+ i1=winstart(i)
+ i2=winend(i)
+ it1=itype(i1)
+ it2=itype(i2)
+ write (iout,'(a,i3,a,i3,a,i3)') restyp(it1),i1,restyp(it2),i2,
+ & ' length',winlen(i)
+ enddo
+ endif
+C Rbolt=8.3143D-3*2.388459D-01 kcal/(mol*K)
+ RBol=1.9858D-3
+C Number of "end bonds".
+ koniecl=0
+c koniecl=nphi
+ print *,'koniecl=',koniecl
+ write (iout,'(a)') 'Probabilities of move types:'
+ write (*,'(a)') 'Probabilities of move types:'
+ do i=1,MaxMoveType
+ write (iout,'(a,f10.5)') MovTypID(i),
+ & sumpro_type(i)-sumpro_type(i-1)
+ write (*,'(a,f10.5)') MovTypID(i),
+ & sumpro_type(i)-sumpro_type(i-1)
+ enddo
+ write (iout,*)
+C Maximum length of N-bond segment to be moved
+c nbm=nres-1-(2*koniecl-1)
+ if (nwindow.gt.0) then
+ maxwinlen=winlen(1)
+ do i=2,nwindow
+ if (winlen(i).gt.maxwinlen) maxwinlen=winlen(i)
+ enddo
+ nbm=min0(maxwinlen,6)
+ write (iout,'(a,i3,a,i3)') 'Nbm=',Nbm,' Maxwinlen=',Maxwinlen
+ else
+ nbm=min0(6,nres-2)
+ endif
+ sumpro_bond(0)=0.0D0
+ sumpro_bond(1)=0.0D0
+ do i=2,nbm
+ sumpro_bond(i)=sumpro_bond(i-1)+1.0D0/dfloat(i)
+ enddo
+ write (iout,'(a)') 'The SumPro_Bond array:'
+ write (iout,'(8f10.5)') (sumpro_bond(i),i=1,nbm)
+ write (*,'(a)') 'The SumPro_Bond array:'
+ write (*,'(8f10.5)') (sumpro_bond(i),i=1,nbm)
+C Maximum number of side chains moved simultaneously
+c print *,'nnt=',nnt,' nct=',nct
+ ngly=0
+ do i=nnt,nct
+ if (itype(i).eq.10) ngly=ngly+1
+ enddo
+ mmm=nct-nnt-ngly+1
+ if (mmm.gt.0) then
+ MaxSideMove=min0((nct-nnt+1)/2,mmm)
+ endif
+c print *,'MaxSideMove=',MaxSideMove
+C Max. number of generated confs (not used at present).
+ maxgen=10000
+C Set initial temperature
+ Tcur=Tmin
+ betbol=1.0D0/(Rbol*Tcur)
+ write (iout,'(a,f8.1,a,f10.5)') 'Initial temperature:',Tcur,
+ & ' BetBol:',betbol
+ write (iout,*) 'RanFract=',ranfract
+ return
+ end
+c------------------------------------------------------------------------------
+#ifndef MPI
+ subroutine do_mcm(i_orig)
+C Monte-Carlo-with-Minimization calculations - serial code.
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.GEO'
+ include 'COMMON.CHAIN'
+ include 'COMMON.MCM'
+ include 'COMMON.CONTACTS'
+ include 'COMMON.CONTROL'
+ include 'COMMON.VAR'
+ include 'COMMON.INTERACT'
+ include 'COMMON.CACHE'
+crc include 'COMMON.DEFORM'
+crc include 'COMMON.DEFORM1'
+ include 'COMMON.NAMES'
+ logical accepted,over,ovrtim,error,lprint,not_done,my_conf,
+ & enelower,non_conv
+ integer MoveType,nbond,conf_comp
+ integer ifeed(max_cache)
+ double precision varia(maxvar),varold(maxvar),elowest,eold,
+ & przes(3),obr(3,3)
+ double precision energia(0:n_ene)
+ double precision coord1(maxres,3)
+
+C---------------------------------------------------------------------------
+C Initialize counters.
+C---------------------------------------------------------------------------
+C Total number of generated confs.
+ ngen=0
+C Total number of moves. In general this won't be equal to the number of
+C attempted moves, because we may want to reject some "bad" confs just by
+C overlap check.
+ nmove=0
+C Total number of temperature jumps.
+ ntherm=0
+C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,...
+C motions.
+ ncache=0
+ do i=1,nres
+ nbond_move(i)=0
+ enddo
+C Initialize total and accepted number of moves of various kind.
+ do i=0,MaxMoveType
+ moves(i)=0
+ moves_acc(i)=0
+ enddo
+C Total number of energy evaluations.
+ neneval=0
+ nfun=0
+ nsave=0
+
+ write (iout,*) 'RanFract=',RanFract
+
+ WhatsUp=0
+ Kwita=0
+
+c----------------------------------------------------------------------------
+C Compute and print initial energies.
+c----------------------------------------------------------------------------
+ call intout
+ write (iout,'(/80(1h*)/a)') 'Initial energies:'
+ call chainbuild
+ nf=0
+
+ call etotal(energia(0))
+ etot = energia(0)
+C Minimize the energy of the first conformation.
+ if (minim) then
+ call geom_to_var(nvar,varia)
+! write (iout,*) 'The VARIA array'
+! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar)
+ call minimize(etot,varia,iretcode,nfun)
+ call var_to_geom(nvar,varia)
+ call chainbuild
+ write (iout,*) 'etot from MINIMIZE:',etot
+! write (iout,*) 'Tha VARIA array'
+! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar)
+
+ call etotal(energia(0))
+ etot=energia(0)
+ call enerprint(energia(0))
+ endif
+ if (refstr) then
+ call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes,
+ & obr,non_conv)
+ rms=dsqrt(rms)
+ call contact(.false.,ncont,icont,co)
+ frac=contact_fract(ncont,ncont_ref,icont,icont_ref)
+ write (iout,'(a,f8.3,a,f8.3,a,f8.3)')
+ & 'RMS deviation from the reference structure:',rms,
+ & ' % of native contacts:',frac*100,' contact order:',co
+ if (print_stat)
+ & write (istat,'(i5,17(1pe14.5))') 0,
+ & (energia(print_order(i)),i=1,nprint_ene),
+ & etot,rms,frac,co
+ else
+ if (print_stat) write (istat,'(i5,16(1pe14.5))') 0,
+ & (energia(print_order(i)),i=1,nprint_ene),etot
+ endif
+ if (print_stat) close(istat)
+ neneval=neneval+nfun+1
+ write (iout,'(/80(1h*)/20x,a/80(1h*))')
+ & 'Enter Monte Carlo procedure.'
+ if (print_int) then
+ close(igeom)
+ call briefout(0,etot)
+ endif
+ eold=etot
+ do i=1,nvar
+ varold(i)=varia(i)
+ enddo
+ elowest=etot
+ call zapis(varia,etot)
+ nacc=0 ! total # of accepted confs of the current processor.
+ nacc_tot=0 ! total # of accepted confs of all processors.
+
+ not_done = (iretcode.ne.11)
+
+C----------------------------------------------------------------------------
+C Main loop.
+c----------------------------------------------------------------------------
+ it=0
+ nout=0
+ do while (not_done)
+ it=it+1
+ write (iout,'(80(1h*)/20x,a,i7)')
+ & 'Beginning iteration #',it
+C Initialize local counter.
+ ntrial=0 ! # of generated non-overlapping confs.
+ accepted=.false.
+ do while (.not. accepted)
+
+C Retrieve the angles of previously accepted conformation
+ noverlap=0 ! # of overlapping confs.
+ do j=1,nvar
+ varia(j)=varold(j)
+ enddo
+ call var_to_geom(nvar,varia)
+C Rebuild the chain.
+ call chainbuild
+C Heat up the system, if necessary.
+ call heat(over)
+C If temperature cannot be further increased, stop.
+ if (over) goto 20
+ MoveType=0
+ nbond=0
+ lprint=.true.
+cd write (iout,'(a)') 'Old variables:'
+cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar)
+C Decide whether to generate a random conformation or perturb the old one
+ RandOrPert=ran_number(0.0D0,1.0D0)
+ if (RandOrPert.gt.RanFract) then
+ if (print_mc.gt.0)
+ & write (iout,'(a)') 'Perturbation-generated conformation.'
+ call perturb(error,lprint,MoveType,nbond,1.0D0)
+ if (error) goto 20
+ if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then
+ write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=',
+ & MoveType,' returned from PERTURB.'
+ goto 20
+ endif
+ call chainbuild
+ else
+ MoveType=0
+ moves(0)=moves(0)+1
+ nstart_grow=iran_num(3,nres)
+ if (print_mc.gt.0)
+ & write (iout,'(2a,i3)') 'Random-generated conformation',
+ & ' - chain regrown from residue',nstart_grow
+ call gen_rand_conf(nstart_grow,*30)
+ endif
+ call geom_to_var(nvar,varia)
+cd write (iout,'(a)') 'New variables:'
+cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar)
+ ngen=ngen+1
+
+ call etotal(energia(0))
+ etot=energia(0)
+c call enerprint(energia(0))
+c write (iout,'(2(a,1pe14.5))') 'Etot=',Etot,' Elowest=',Elowest
+ if (etot-elowest.gt.overlap_cut) then
+ if(iprint.gt.1.or.etot.lt.1d20)
+ & write (iout,'(a,1pe14.5)')
+ & 'Overlap detected in the current conf.; energy is',etot
+ neneval=neneval+1
+ accepted=.false.
+ noverlap=noverlap+1
+ if (noverlap.gt.maxoverlap) then
+ write (iout,'(a)') 'Too many overlapping confs.'
+ goto 20
+ endif
+ else
+ if (minim) then
+ call minimize(etot,varia,iretcode,nfun)
+cd write (iout,*) 'etot from MINIMIZE:',etot
+cd write (iout,'(a)') 'Variables after minimization:'
+cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar)
+
+ call etotal(energia(0))
+ etot = energia(0)
+ neneval=neneval+nfun+2
+ endif
+c call enerprint(energia(0))
+ write (iout,'(a,i6,a,1pe16.6)') 'Conformation:',ngen,
+ & ' energy:',etot
+C--------------------------------------------------------------------------
+C... Do Metropolis test
+C--------------------------------------------------------------------------
+ accepted=.false.
+ my_conf=.false.
+
+ if (WhatsUp.eq.0 .and. Kwita.eq.0) then
+ call metropolis(nvar,varia,varold,etot,eold,accepted,
+ & my_conf,EneLower)
+ endif
+ write (iout,*) 'My_Conf=',My_Conf,' EneLower=',EneLower
+ if (accepted) then
+
+ nacc=nacc+1
+ nacc_tot=nacc_tot+1
+ if (elowest.gt.etot) elowest=etot
+ moves_acc(MoveType)=moves_acc(MoveType)+1
+ if (MoveType.eq.1) then
+ nbond_acc(nbond)=nbond_acc(nbond)+1
+ endif
+C Check against conformation repetitions.
+ irepet=conf_comp(varia,etot)
+ if (print_stat) then
+#if defined(AIX) || defined(PGI)
+ open (istat,file=statname,position='append')
+#else
+ open (istat,file=statname,access='append')
+#endif
+ endif
+ call statprint(nacc,nfun,iretcode,etot,elowest)
+ if (refstr) then
+ call var_to_geom(nvar,varia)
+ call chainbuild
+ call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),
+ & nsup,przes,obr,non_conv)
+ rms=dsqrt(rms)
+ call contact(.false.,ncont,icont,co)
+ frac=contact_fract(ncont,ncont_ref,icont,icont_ref)
+ write (iout,'(a,f8.3,a,f8.3)')
+ & 'RMS deviation from the reference structure:',rms,
+ & ' % of native contacts:',frac*100,' contact order',co
+ endif ! refstr
+ if (My_Conf) then
+ nout=nout+1
+ write (iout,*) 'Writing new conformation',nout
+ if (refstr) then
+ write (istat,'(i5,16(1pe14.5))') nout,
+ & (energia(print_order(i)),i=1,nprint_ene),
+ & etot,rms,frac
+ else
+ if (print_stat)
+ & write (istat,'(i5,17(1pe14.5))') nout,
+ & (energia(print_order(i)),i=1,nprint_ene),etot
+ endif ! refstr
+ if (print_stat) close(istat)
+C Print internal coordinates.
+ if (print_int) call briefout(nout,etot)
+C Accumulate the newly accepted conf in the coord1 array, if it is different
+C from all confs that are already there.
+ call compare_s1(n_thr,max_thread2,etot,varia,ii,
+ & enetb1,coord1,rms_deform,.true.,iprint)
+ write (iout,*) 'After compare_ss: n_thr=',n_thr
+ if (ii.eq.1 .or. ii.eq.3) then
+ write (iout,'(8f10.4)')
+ & (rad2deg*coord1(i,n_thr),i=1,nvar)
+ endif
+ else
+ write (iout,*) 'Conformation from cache, not written.'
+ endif ! My_Conf
+
+ if (nrepm.gt.maxrepm) then
+ write (iout,'(a)') 'Too many conformation repetitions.'
+ goto 20
+ endif
+C Store the accepted conf. and its energy.
+ eold=etot
+ do i=1,nvar
+ varold(i)=varia(i)
+ enddo
+ if (irepet.eq.0) call zapis(varia,etot)
+C Lower the temperature, if necessary.
+ call cool
+
+ else
+
+ ntrial=ntrial+1
+ endif ! accepted
+ endif ! overlap
+
+ 30 continue
+ enddo ! accepted
+C Check for time limit.
+ if (ovrtim()) WhatsUp=-1
+ not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0)
+ & .and. (Kwita.eq.0)
+
+ enddo ! not_done
+ goto 21
+ 20 WhatsUp=-3
+
+ 21 continue
+ runtime=tcpu()
+ write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:'
+ call statprint(nacc,nfun,iretcode,etot,elowest)
+ write (iout,'(a)')
+ & 'Statistics of multiple-bond motions. Total motions:'
+ write (iout,'(16i5)') (nbond_move(i),i=1,Nbm)
+ write (iout,'(a)') 'Accepted motions:'
+ write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm)
+ if (it.ge.maxacc)
+ &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.'
+
+ return
+ end
+#endif
+#ifdef MPI
+c------------------------------------------------------------------------------
+ subroutine do_mcm(i_orig)
+C Monte-Carlo-with-Minimization calculations - parallel code.
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'mpif.h'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.GEO'
+ include 'COMMON.CHAIN'
+ include 'COMMON.MCM'
+ include 'COMMON.CONTACTS'
+ include 'COMMON.CONTROL'
+ include 'COMMON.VAR'
+ include 'COMMON.INTERACT'
+ include 'COMMON.INFO'
+ include 'COMMON.CACHE'
+crc include 'COMMON.DEFORM'
+crc include 'COMMON.DEFORM1'
+crc include 'COMMON.DEFORM2'
+ include 'COMMON.MINIM'
+ include 'COMMON.NAMES'
+ logical accepted,over,ovrtim,error,lprint,not_done,similar,
+ & enelower,non_conv,flag,finish
+ integer MoveType,nbond,conf_comp
+ double precision varia(maxvar),varold(maxvar),elowest,eold,
+ & x1(maxvar), varold1(maxvar), przes(3),obr(3,3)
+ integer iparentx(max_threadss2)
+ integer iparentx1(max_threadss2)
+ integer imtasks(150),imtasks_n
+ double precision energia(0:n_ene)
+
+ print *,'Master entered DO_MCM'
+ nodenum = nprocs
+
+ finish=.false.
+ imtasks_n=0
+ do i=1,nodenum-1
+ imtasks(i)=0
+ enddo
+C---------------------------------------------------------------------------
+C Initialize counters.
+C---------------------------------------------------------------------------
+C Total number of generated confs.
+ ngen=0
+C Total number of moves. In general this won`t be equal to the number of
+C attempted moves, because we may want to reject some "bad" confs just by
+C overlap check.
+ nmove=0
+C Total number of temperature jumps.
+ ntherm=0
+C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,...
+C motions.
+ ncache=0
+ do i=1,nres
+ nbond_move(i)=0
+ enddo
+C Initialize total and accepted number of moves of various kind.
+ do i=0,MaxMoveType
+ moves(i)=0
+ moves_acc(i)=0
+ enddo
+C Total number of energy evaluations.
+ neneval=0
+ nfun=0
+ nsave=0
+c write (iout,*) 'RanFract=',RanFract
+ WhatsUp=0
+ Kwita=0
+c----------------------------------------------------------------------------
+C Compute and print initial energies.
+c----------------------------------------------------------------------------
+ call intout
+ write (iout,'(/80(1h*)/a)') 'Initial energies:'
+ call chainbuild
+ nf=0
+ call etotal(energia(0))
+ etot = energia(0)
+ call enerprint(energia(0))
+C Request energy computation from slave processors.
+ call geom_to_var(nvar,varia)
+! write (iout,*) 'The VARIA array'
+! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar)
+ call minimize(etot,varia,iretcode,nfun)
+ call var_to_geom(nvar,varia)
+ call chainbuild
+ write (iout,*) 'etot from MINIMIZE:',etot
+! write (iout,*) 'Tha VARIA array'
+! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar)
+ neneval=0
+ eneglobal=1.0d99
+ if (print_mc .gt. 0) write (iout,'(/80(1h*)/20x,a/80(1h*))')
+ & 'Enter Monte Carlo procedure.'
+ if (print_mc .gt. 0) write (iout,'(i5,1pe14.5)' ) i_orig,etot
+ eold=etot
+ do i=1,nvar
+ varold(i)=varia(i)
+ enddo
+ elowest=etot
+ call zapis(varia,etot)
+c diagnostics
+ call var_to_geom(nvar,varia)
+ call chainbuild
+ call etotal(energia(0))
+ if (print_mc.gt.0) write (iout,*) 'Initial energy:',etot
+c end diagnostics
+ nacc=0 ! total # of accepted confs of the current processor.
+ nacc_tot=0 ! total # of accepted confs of all processors.
+ not_done=.true.
+C----------------------------------------------------------------------------
+C Main loop.
+c----------------------------------------------------------------------------
+ it=0
+ nout=0
+ LOOP1:do while (not_done)
+ it=it+1
+ if (print_mc.gt.0) write (iout,'(80(1h*)/20x,a,i7)')
+ & 'Beginning iteration #',it
+C Initialize local counter.
+ ntrial=0 ! # of generated non-overlapping confs.
+ noverlap=0 ! # of overlapping confs.
+ accepted=.false.
+ LOOP2:do while (.not. accepted)
+
+ LOOP3:do while (imtasks_n.lt.nodenum-1.and..not.finish)
+ do i=1,nodenum-1
+ if(imtasks(i).eq.0) then
+ is=i
+ exit
+ endif
+ enddo
+C Retrieve the angles of previously accepted conformation
+ do j=1,nvar
+ varia(j)=varold(j)
+ enddo
+ call var_to_geom(nvar,varia)
+C Rebuild the chain.
+ call chainbuild
+C Heat up the system, if necessary.
+ call heat(over)
+C If temperature cannot be further increased, stop.
+ if (over) then
+ finish=.true.
+ endif
+ MoveType=0
+ nbond=0
+c write (iout,'(a)') 'Old variables:'
+c write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar)
+C Decide whether to generate a random conformation or perturb the old one
+ RandOrPert=ran_number(0.0D0,1.0D0)
+ if (RandOrPert.gt.RanFract) then
+ if (print_mc.gt.0)
+ & write (iout,'(a)') 'Perturbation-generated conformation.'
+ call perturb(error,lprint,MoveType,nbond,1.0D0)
+c print *,'after perturb',error,finish
+ if (error) finish = .true.
+ if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then
+ write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=',
+ & MoveType,' returned from PERTURB.'
+ finish=.true.
+ write (*,'(/a,i7,a/)') 'Error - unknown MoveType=',
+ & MoveType,' returned from PERTURB.'
+ endif
+ call chainbuild
+ else
+ MoveType=0
+ moves(0)=moves(0)+1
+ nstart_grow=iran_num(3,nres)
+ if (print_mc.gt.0)
+ & write (iout,'(2a,i3)') 'Random-generated conformation',
+ & ' - chain regrown from residue',nstart_grow
+ call gen_rand_conf(nstart_grow,*30)
+ endif
+ call geom_to_var(nvar,varia)
+ ngen=ngen+1
+c print *,'finish=',finish
+ if (etot-elowest.gt.overlap_cut) then
+ if (print_mc.gt.1) write (iout,'(a,1pe14.5)')
+ & 'Overlap detected in the current conf.; energy is',etot
+ if(iprint.gt.1.or.etot.lt.1d19) print *,
+ & 'Overlap detected in the current conf.; energy is',etot
+ neneval=neneval+1
+ accepted=.false.
+ noverlap=noverlap+1
+ if (noverlap.gt.maxoverlap) then
+ write (iout,*) 'Too many overlapping confs.',
+ & ' etot, elowest, overlap_cut', etot, elowest, overlap_cut
+ finish=.true.
+ endif
+ else if (.not. finish) then
+C Distribute tasks to processors
+c print *,'Master sending order'
+ call MPI_SEND(12, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, ierr)
+c write (iout,*) '12: tag=',tag
+c print *,'Master sent order to processor',is
+ call MPI_SEND(it, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, ierr)
+c write (iout,*) 'it: tag=',tag
+ call MPI_SEND(eold, 1, MPI_DOUBLE_PRECISION, is, tag,
+ & CG_COMM, ierr)
+c write (iout,*) 'eold: tag=',tag
+ call MPI_SEND(varia(1), nvar, MPI_DOUBLE_PRECISION,
+ & is, tag,
+ & CG_COMM, ierr)
+c write (iout,*) 'varia: tag=',tag
+ call MPI_SEND(varold(1), nvar, MPI_DOUBLE_PRECISION,
+ & is, tag,
+ & CG_COMM, ierr)
+c write (iout,*) 'varold: tag=',tag
+#ifdef AIX
+ call flush_(iout)
+#else
+ call flush(iout)
+#endif
+ imtasks(is)=1
+ imtasks_n=imtasks_n+1
+C End distribution
+ endif ! overlap
+ enddo LOOP3
+
+ flag = .false.
+ LOOP_RECV:do while(.not.flag)
+ do is=1, nodenum-1
+ call MPI_IPROBE(is,tag,CG_COMM,flag,status,ierr)
+ if(flag) then
+ call MPI_RECV(iitt, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, status, ierr)
+ call MPI_RECV(eold1, 1, MPI_DOUBLE_PRECISION, is, tag,
+ & CG_COMM, status, ierr)
+ call MPI_RECV(etot, 1, MPI_DOUBLE_PRECISION, is, tag,
+ & CG_COMM, status, ierr)
+ call MPI_RECV(varia(1), nvar, MPI_DOUBLE_PRECISION,is,tag,
+ & CG_COMM, status, ierr)
+ call MPI_RECV(varold1(1), nvar, MPI_DOUBLE_PRECISION, is,
+ & tag, CG_COMM, status, ierr)
+ call MPI_RECV(ii_grnum_d, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, status, ierr)
+ call MPI_RECV(ii_ennum_d, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, status, ierr)
+ call MPI_RECV(ii_hesnum_d, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, status, ierr)
+ i_grnum_d=i_grnum_d+ii_grnum_d
+ i_ennum_d=i_ennum_d+ii_ennum_d
+ neneval = neneval+ii_ennum_d
+ i_hesnum_d=i_hesnum_d+ii_hesnum_d
+ i_minimiz=i_minimiz+1
+ imtasks(is)=0
+ imtasks_n=imtasks_n-1
+ exit
+ endif
+ enddo
+ enddo LOOP_RECV
+
+ if(print_mc.gt.0) write (iout,'(a,i6,a,i6,a,i6,a,1pe16.6)')
+ & 'From Worker #',is,' iitt',iitt,
+ & ' Conformation:',ngen,' energy:',etot
+C--------------------------------------------------------------------------
+C... Do Metropolis test
+C--------------------------------------------------------------------------
+ call metropolis(nvar,varia,varold1,etot,eold1,accepted,
+ & similar,EneLower)
+ if(iitt.ne.it.and..not.similar) then
+ call metropolis(nvar,varia,varold,etot,eold,accepted,
+ & similar,EneLower)
+ accepted=enelower
+ endif
+ if(etot.lt.eneglobal)eneglobal=etot
+c if(mod(it,100).eq.0)
+ write(iout,*)'CHUJOJEB ',neneval,eneglobal
+ if (accepted) then
+C Write the accepted conformation.
+ nout=nout+1
+ if (refstr) then
+ call var_to_geom(nvar,varia)
+ call chainbuild
+ call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),
+ & nsup,przes,obr,non_conv)
+ rms=dsqrt(rms)
+ call contact(.false.,ncont,icont,co)
+ frac=contact_fract(ncont,ncont_ref,icont,icont_ref)
+ write (iout,'(a,f8.3,a,f8.3,a,f8.3)')
+ & 'RMS deviation from the reference structure:',rms,
+ & ' % of native contacts:',frac*100,' contact order:',co
+ endif ! refstr
+ if (print_mc.gt.0)
+ & write (iout,*) 'Writing new conformation',nout
+ if (print_stat) then
+ call var_to_geom(nvar,varia)
+#if defined(AIX) || defined(PGI)
+ open (istat,file=statname,position='append')
+#else
+ open (istat,file=statname,access='append')
+#endif
+ if (refstr) then
+ write (istat,'(i5,16(1pe14.5))') nout,
+ & (energia(print_order(i)),i=1,nprint_ene),
+ & etot,rms,frac
+ else
+ write (istat,'(i5,16(1pe14.5))') nout,
+ & (energia(print_order(i)),i=1,nprint_ene),etot
+ endif ! refstr
+ close(istat)
+ endif ! print_stat
+C Print internal coordinates.
+ if (print_int) call briefout(nout,etot)
+ nacc=nacc+1
+ nacc_tot=nacc_tot+1
+ if (elowest.gt.etot) elowest=etot
+ moves_acc(MoveType)=moves_acc(MoveType)+1
+ if (MoveType.eq.1) then
+ nbond_acc(nbond)=nbond_acc(nbond)+1
+ endif
+C Check against conformation repetitions.
+ irepet=conf_comp(varia,etot)
+ if (nrepm.gt.maxrepm) then
+ if (print_mc.gt.0)
+ & write (iout,'(a)') 'Too many conformation repetitions.'
+ finish=.true.
+ endif
+C Store the accepted conf. and its energy.
+ eold=etot
+ do i=1,nvar
+ varold(i)=varia(i)
+ enddo
+ if (irepet.eq.0) call zapis(varia,etot)
+C Lower the temperature, if necessary.
+ call cool
+ else
+ ntrial=ntrial+1
+ endif ! accepted
+ 30 continue
+ if(finish.and.imtasks_n.eq.0)exit LOOP2
+ enddo LOOP2 ! accepted
+C Check for time limit.
+ not_done = (it.lt.max_mcm_it) .and. (nacc_tot.lt.maxacc)
+ if(.not.not_done .or. finish) then
+ if(imtasks_n.gt.0) then
+ not_done=.true.
+ else
+ not_done=.false.
+ endif
+ finish=.true.
+ endif
+ enddo LOOP1 ! not_done
+ runtime=tcpu()
+ if (print_mc.gt.0) then
+ write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:'
+ call statprint(nacc,nfun,iretcode,etot,elowest)
+ write (iout,'(a)')
+ & 'Statistics of multiple-bond motions. Total motions:'
+ write (iout,'(16i5)') (nbond_move(i),i=1,Nbm)
+ write (iout,'(a)') 'Accepted motions:'
+ write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm)
+ if (it.ge.maxacc)
+ &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.'
+ endif
+#ifdef AIX
+ call flush_(iout)
+#else
+ call flush(iout)
+#endif
+ do is=1,nodenum-1
+ call MPI_SEND(999, 1, MPI_INTEGER, is, tag,
+ & CG_COMM, ierr)
+ enddo
+ return
+ end
+c------------------------------------------------------------------------------
+ subroutine execute_slave(nodeinfo,iprint)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'mpif.h'
+ include 'COMMON.TIME1'
+ include 'COMMON.IOUNITS'
+crc include 'COMMON.DEFORM'
+crc include 'COMMON.DEFORM1'
+crc include 'COMMON.DEFORM2'
+ include 'COMMON.LOCAL'
+ include 'COMMON.VAR'
+ include 'COMMON.INFO'
+ include 'COMMON.MINIM'
+ character*10 nodeinfo
+ double precision x(maxvar),x1(maxvar)
+ nodeinfo='chujwdupe'
+c print *,'Processor:',MyID,' Entering execute_slave'
+ tag=0
+c call MPI_SEND(nodeinfo, 10, MPI_CHARACTER, 0, tag,
+c & CG_COMM, ierr)
+
+1001 call MPI_RECV(i_switch, 1, MPI_INTEGER, 0, tag,
+ & CG_COMM, status, ierr)
+c write(iout,*)'12: tag=',tag
+ if(iprint.ge.2)print *, MyID,' recv order ',i_switch
+ if (i_switch.eq.12) then
+ i_grnum_d=0
+ i_ennum_d=0
+ i_hesnum_d=0
+ call MPI_RECV(iitt, 1, MPI_INTEGER, 0, tag,
+ & CG_COMM, status, ierr)
+c write(iout,*)'12: tag=',tag
+ call MPI_RECV(ener, 1, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, status, ierr)
+c write(iout,*)'ener: tag=',tag
+ call MPI_RECV(x(1), nvar, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, status, ierr)
+c write(iout,*)'x: tag=',tag
+ call MPI_RECV(x1(1), nvar, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, status, ierr)
+c write(iout,*)'x1: tag=',tag
+#ifdef AIX
+ call flush_(iout)
+#else
+ call flush(iout)
+#endif
+c print *,'calling minimize'
+ call minimize(energyx,x,iretcode,nfun)
+ if(iprint.gt.0)
+ & write(iout,100)'minimized energy = ',energyx,
+ & ' # funeval:',nfun,' iret ',iretcode
+ write(*,100)'minimized energy = ',energyx,
+ & ' # funeval:',nfun,' iret ',iretcode
+ 100 format(a20,f10.5,a12,i5,a6,i2)
+ if(iretcode.eq.10) then
+ do iminrep=2,3
+ if(iprint.gt.1)
+ & write(iout,*)' ... not converged - trying again ',iminrep
+ call minimize(energyx,x,iretcode,nfun)
+ if(iprint.gt.1)
+ & write(iout,*)'minimized energy = ',energyx,
+ & ' # funeval:',nfun,' iret ',iretcode
+ if(iretcode.ne.10)go to 812
+ enddo
+ if(iretcode.eq.10) then
+ if(iprint.gt.1)
+ & write(iout,*)' ... not converged again - giving up'
+ go to 812
+ endif
+ endif
+812 continue
+c print *,'Sending results'
+ call MPI_SEND(iitt, 1, MPI_INTEGER, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(ener, 1, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(energyx, 1, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(x(1), nvar, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(x1(1), nvar, MPI_DOUBLE_PRECISION, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(i_grnum_d, 1, MPI_INTEGER, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(nfun, 1, MPI_INTEGER, 0, tag,
+ & CG_COMM, ierr)
+ call MPI_SEND(i_hesnum_d, 1, MPI_INTEGER, 0, tag,
+ & CG_COMM, ierr)
+c print *,'End sending'
+ go to 1001
+ endif
+
+ return
+ end
+#endif
+c------------------------------------------------------------------------------
+ subroutine statprint(it,nfun,iretcode,etot,elowest)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.CONTROL'
+ include 'COMMON.MCM'
+ if (minim) then
+ write (iout,
+ & '(80(1h*)/a,i5,a,1pe14.5,a,1pe14.5/a,i3,a,i10,a,i5,a,i5)')
+ & 'Finished iteration #',it,' energy is',etot,
+ & ' lowest energy:',elowest,
+ & 'SUMSL return code:',iretcode,
+ & ' # of energy evaluations:',neneval,
+ & '# of temperature jumps:',ntherm,
+ & ' # of minima repetitions:',nrepm
+ else
+ write (iout,'(80(1h*)/a,i8,a,1pe14.5,a,1pe14.5)')
+ & 'Finished iteration #',it,' energy is',etot,
+ & ' lowest energy:',elowest
+ endif
+ write (iout,'(/4a)')
+ & 'Kind of move ',' total',' accepted',
+ & ' fraction'
+ write (iout,'(58(1h-))')
+ do i=-1,MaxMoveType
+ if (moves(i).eq.0) then
+ fr_mov_i=0.0d0
+ else
+ fr_mov_i=dfloat(moves_acc(i))/dfloat(moves(i))
+ endif
+ write(iout,'(a,2i15,f10.5)')MovTypID(i),moves(i),moves_acc(i),
+ & fr_mov_i
+ enddo
+ write (iout,'(a,2i15,f10.5)') 'total ',nmove,nacc_tot,
+ & dfloat(nacc_tot)/dfloat(nmove)
+ write (iout,'(58(1h-))')
+ write (iout,'(a,1pe12.4)') 'Elapsed time:',tcpu()
+ return
+ end
+c------------------------------------------------------------------------------
+ subroutine heat(over)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.MCM'
+ include 'COMMON.IOUNITS'
+ logical over
+C Check if there`s a need to increase temperature.
+ if (ntrial.gt.maxtrial) then
+ if (NstepH.gt.0) then
+ if (dabs(Tcur-TMax).lt.1.0D-7) then
+ if (print_mc.gt.0)
+ & write (iout,'(/80(1h*)/a,f8.3,a/80(1h*))')
+ & 'Upper limit of temperature reached. Terminating.'
+ over=.true.
+ Tcur=Tmin
+ else
+ Tcur=Tcur*TstepH
+ if (Tcur.gt.Tmax) Tcur=Tmax
+ betbol=1.0D0/(Rbol*Tcur)
+ if (print_mc.gt.0)
+ & write (iout,'(/80(1h*)/a,f8.3,a,f10.5/80(1h*))')
+ & 'System heated up to ',Tcur,' K; BetBol:',betbol
+ ntherm=ntherm+1
+ ntrial=0
+ over=.false.
+ endif
+ else
+ if (print_mc.gt.0)
+ & write (iout,'(a)')
+ & 'Maximum number of trials in a single MCM iteration exceeded.'
+ over=.true.
+ Tcur=Tmin
+ endif
+ else
+ over=.false.
+ endif
+ return
+ end
+c------------------------------------------------------------------------------
+ subroutine cool
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.MCM'
+ include 'COMMON.IOUNITS'
+ if (nstepC.gt.0 .and. dabs(Tcur-Tmin).gt.1.0D-7) then
+ Tcur=Tcur/TstepC
+ if (Tcur.lt.Tmin) Tcur=Tmin
+ betbol=1.0D0/(Rbol*Tcur)
+ if (print_mc.gt.0)
+ & write (iout,'(/80(1h*)/a,f8.3,a,f10.5/80(1h*))')
+ & 'System cooled down up to ',Tcur,' K; BetBol:',betbol
+ endif
+ return
+ end
+C---------------------------------------------------------------------------
+ subroutine zapis(varia,etot)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+#ifdef MP
+ include 'mpif.h'
+ include 'COMMON.INFO'
+#endif
+ include 'COMMON.GEO'
+ include 'COMMON.VAR'
+ include 'COMMON.MCM'
+ include 'COMMON.IOUNITS'
+ integer itemp(maxsave)
+ double precision varia(maxvar)
+ logical lprint
+ lprint=.false.
+ if (lprint) then
+ write (iout,'(a,i5,a,i5)') 'Enter ZAPIS NSave=',Nsave,
+ & ' MaxSave=',MaxSave
+ write (iout,'(a)') 'Current energy and conformation:'
+ write (iout,'(1pe14.5)') etot
+ write (iout,'(10f8.3)') (rad2deg*varia(i),i=1,nvar)
+ endif
+C Shift the contents of the esave and varsave arrays if filled up.
+ call add2cache(maxvar,maxsave,nsave,nvar,MyID,itemp,
+ & etot,varia,esave,varsave)
+ if (lprint) then
+ write (iout,'(a)') 'Energies and the VarSave array.'
+ do i=1,nsave
+ write (iout,'(i5,1pe14.5)') i,esave(i)
+ write (iout,'(10f8.3)') (rad2deg*varsave(j,i),j=1,nvar)
+ enddo
+ endif
+ return
+ end
+C---------------------------------------------------------------------------
+ subroutine perturb(error,lprint,MoveType,nbond,max_phi)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ parameter (MMaxSideMove=100)
+ include 'COMMON.MCM'
+ include 'COMMON.CHAIN'
+ include 'COMMON.INTERACT'
+ include 'COMMON.VAR'
+ include 'COMMON.GEO'
+ include 'COMMON.NAMES'
+ include 'COMMON.IOUNITS'
+crc include 'COMMON.DEFORM1'
+ logical error,lprint,fail
+ integer MoveType,nbond,end_select,ind_side(MMaxSideMove)
+ double precision max_phi
+ double precision psi,gen_psi
+ external iran_num
+ integer iran_num
+ integer ifour
+ data ifour /4/
+ error=.false.
+ lprint=.false.
+C Perturb the conformation according to a randomly selected move.
+ call SelectMove(MoveType)
+c write (iout,*) 'MoveType=',MoveType
+ itrial=0
+ goto (100,200,300,400,500) MoveType
+C------------------------------------------------------------------------------
+C Backbone N-bond move.
+C Select the number of bonds (length of the segment to perturb).
+ 100 continue
+ if (itrial.gt.1000) then
+ write (iout,'(a)') 'Too many attempts at multiple-bond move.'
+ error=.true.
+ return
+ endif
+ bond_prob=ran_number(0.0D0,sumpro_bond(nbm))
+c print *,'sumpro_bond(nbm)=',sumpro_bond(nbm),
+c & ' Bond_prob=',Bond_Prob
+ do i=1,nbm-1
+c print *,i,Bond_Prob,sumpro_bond(i),sumpro_bond(i+1)
+ if (bond_prob.ge.sumpro_bond(i) .and.
+ & bond_prob.le.sumpro_bond(i+1)) then
+ nbond=i+1
+ goto 10
+ endif
+ enddo
+ write (iout,'(2a)') 'In PERTURB: Error - number of bonds',
+ & ' to move out of range.'
+ error=.true.
+ return
+ 10 continue
+ if (nwindow.gt.0) then
+C Select the first residue to perturb
+ iwindow=iran_num(1,nwindow)
+ print *,'iwindow=',iwindow
+ iiwin=1
+ do while (winlen(iwindow).lt.nbond)
+ iwindow=iran_num(1,nwindow)
+ iiwin=iiwin+1
+ if (iiwin.gt.1000) then
+ write (iout,'(a)') 'Cannot select moveable residues.'
+ error=.true.
+ return
+ endif
+ enddo
+ nstart=iran_num(winstart(iwindow),winend(iwindow))
+ else
+ nstart = iran_num(koniecl+2,nres-nbond-koniecl)
+cd print *,'nres=',nres,' nbond=',nbond,' koniecl=',koniecl,
+cd & ' nstart=',nstart
+ endif
+ psi = gen_psi()
+ if (psi.eq.0.0) then
+ error=.true.
+ return
+ endif
+ if (print_mc.gt.1) write (iout,'(a,i4,a,i4,a,f8.3)')
+ & 'PERTURB: nbond=',nbond,' nstart=',nstart,' psi=',psi*rad2deg
+cd print *,'nstart=',nstart
+ call bond_move(nbond,nstart,psi,.false.,error)
+ if (error) then
+ write (iout,'(2a)')
+ & 'Could not define reference system in bond_move, ',
+ & 'choosing ahother segment.'
+ itrial=itrial+1
+ goto 100
+ endif
+ nbond_move(nbond)=nbond_move(nbond)+1
+ moves(1)=moves(1)+1
+ nmove=nmove+1
+ return
+C------------------------------------------------------------------------------
+C Backbone endmove. Perturb a SINGLE angle of a residue close to the end of
+C the chain.
+ 200 continue
+ lprint=.true.
+c end_select=iran_num(1,2*koniecl)
+c if (end_select.gt.koniecl) then
+c end_select=nphi-(end_select-koniecl)
+c else
+c end_select=koniecl+3
+c endif
+c if (nwindow.gt.0) then
+c iwin=iran_num(1,nwindow)
+c i1=max0(4,winstart(iwin))
+c i2=min0(winend(imin)+2,nres)
+c end_select=iran_num(i1,i2)
+c else
+c iselect = iran_num(1,nmov_var)
+c jj = 0
+c do i=1,nphi
+c if (isearch_tab(i).eq.1) jj = jj+1
+c if (jj.eq.iselect) then
+c end_select=i+3
+c exit
+c endif
+c enddo
+c endif
+ end_select = iran_num(4,nres)
+ psi=max_phi*gen_psi()
+ if (psi.eq.0.0D0) then
+ error=.true.
+ return
+ endif
+ phi(end_select)=pinorm(phi(end_select)+psi)
+ if (print_mc.gt.1) write (iout,'(a,i4,a,f8.3,a,f8.3)')
+ & 'End angle',end_select,' moved by ',psi*rad2deg,' new angle:',
+ & phi(end_select)*rad2deg
+c if (end_select.gt.3)
+c & theta(end_select-1)=gen_theta(itype(end_select-2),
+c & phi(end_select-1),phi(end_select))
+c if (end_select.lt.nres)
+c & theta(end_select)=gen_theta(itype(end_select-1),
+c & phi(end_select),phi(end_select+1))
+cd print *,'nres=',nres,' end_select=',end_select
+cd print *,'theta',end_select-1,theta(end_select-1)
+cd print *,'theta',end_select,theta(end_select)
+ moves(2)=moves(2)+1
+ nmove=nmove+1
+ lprint=.false.
+ return
+C------------------------------------------------------------------------------
+C Side chain move.
+C Select the number of SCs to perturb.
+ 300 isctry=0
+ 301 nside_move=iran_num(1,MaxSideMove)
+c print *,'nside_move=',nside_move,' MaxSideMove',MaxSideMove
+C Select the indices.
+ do i=1,nside_move
+ icount=0
+ 111 inds=iran_num(nnt,nct)
+ icount=icount+1
+ if (icount.gt.1000) then
+ write (iout,'(a)')'Error - cannot select side chains to move.'
+ error=.true.
+ return
+ endif
+ if (itype(inds).eq.10) goto 111
+ do j=1,i-1
+ if (inds.eq.ind_side(j)) goto 111
+ enddo
+ do j=1,i-1
+ if (inds.lt.ind_side(j)) then
+ indx=j
+ goto 112
+ endif
+ enddo
+ indx=i
+ 112 do j=i,indx+1,-1
+ ind_side(j)=ind_side(j-1)
+ enddo
+ 113 ind_side(indx)=inds
+ enddo
+C Carry out perturbation.
+ do i=1,nside_move
+ ii=ind_side(i)
+ iti=itype(ii)
+ call gen_side(iti,theta(ii+1),alph(ii),omeg(ii),fail)
+ if (fail) then
+ isctry=isctry+1
+ if (isctry.gt.1000) then
+ write (iout,'(a)') 'Too many errors in SC generation.'
+ error=.true.
+ return
+ endif
+ goto 301
+ endif
+ if (print_mc.gt.1) write (iout,'(2a,i4,a,2f8.3)')
+ & 'Side chain ',restyp(iti),ii,' moved to ',
+ & alph(ii)*rad2deg,omeg(ii)*rad2deg
+ enddo
+ moves(3)=moves(3)+1
+ nmove=nmove+1
+ return
+C------------------------------------------------------------------------------
+C THETA move
+ 400 end_select=iran_num(3,nres)
+ theta_new=gen_theta(itype(end_select),phi(end_select),
+ & phi(end_select+1))
+ if (print_mc.gt.1) write (iout,'(a,i3,a,f8.3,a,f8.3)')
+ & 'Theta ',end_select,' moved from',theta(end_select)*rad2deg,
+ & ' to ',theta_new*rad2deg
+ theta(end_select)=theta_new
+ moves(4)=moves(4)+1
+ nmove=nmove+1
+ return
+C------------------------------------------------------------------------------
+C Error returned from SelectMove.
+ 500 error=.true.
+ return
+ end
+C------------------------------------------------------------------------------
+ subroutine SelectMove(MoveType)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.MCM'
+ include 'COMMON.IOUNITS'
+ what_move=ran_number(0.0D0,sumpro_type(MaxMoveType))
+ do i=1,MaxMoveType
+ if (what_move.ge.sumpro_type(i-1).and.
+ & what_move.lt.sumpro_type(i)) then
+ MoveType=i
+ return
+ endif
+ enddo
+ write (iout,'(a)')
+ & 'Fatal error in SelectMoveType: cannot select move.'
+ MoveType=MaxMoveType+1
+ return
+ end
+c----------------------------------------------------------------------------
+ double precision function gen_psi()
+ implicit none
+ integer i
+ double precision x,ran_number
+ include 'COMMON.IOUNITS'
+ include 'COMMON.GEO'
+ x=0.0D0
+ do i=1,100
+ x=ran_number(-pi,pi)
+ if (dabs(x).gt.angmin) then
+ gen_psi=x
+ return
+ endif
+ enddo
+ write (iout,'(a)')'From Gen_Psi: Cannot generate angle increment.'
+ gen_psi=0.0D0
+ return
+ end
+c----------------------------------------------------------------------------
+ subroutine metropolis(n,xcur,xold,ecur,eold,accepted,similar,
+ & enelower)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.MCM'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.VAR'
+ include 'COMMON.GEO'
+crc include 'COMMON.DEFORM'
+ double precision ecur,eold,xx,ran_number,bol
+ double precision xcur(n),xold(n)
+ double precision ecut1 ,ecut2 ,tola
+ logical accepted,similar,not_done,enelower
+ logical lprn
+ data ecut1 /-1.0D-5/,ecut2 /5.0D-3/,tola/5.0D0/
+! ecut1=-5*enedif
+! ecut2=50*enedif
+! tola=5.0d0
+C Set lprn=.true. for debugging.
+ lprn=.false.
+ if (lprn)
+ &write(iout,*)'enedif',enedif,' ecut1',ecut1,' ecut2',ecut2
+ similar=.false.
+ enelower=.false.
+ accepted=.false.
+C Check if the conformation is similar.
+ difene=ecur-eold
+ reldife=difene/dmax1(dabs(eold),dabs(ecur),1.0D0)
+ if (lprn) then
+ write (iout,*) 'Metropolis'
+ write(iout,*)'ecur,eold,difene,reldife',ecur,eold,difene,reldife
+ endif
+C If energy went down remarkably, we accept the new conformation
+C unconditionally.
+cjp if (reldife.lt.ecut1) then
+ if (difene.lt.ecut1) then
+ accepted=.true.
+ EneLower=.true.
+ if (lprn) write (iout,'(a)')
+ & 'Conformation accepted, because energy has lowered remarkably.'
+! elseif (reldife.lt.ecut2 .and. dif_ang(nphi,xcur,xold).lt.tola)
+cjp elseif (reldife.lt.ecut2)
+ elseif (difene.lt.ecut2)
+ & then
+C Reject the conf. if energy has changed insignificantly and there is not
+C much change in conformation.
+ if (lprn)
+ & write (iout,'(2a)') 'Conformation rejected, because it is',
+ & ' similar to the preceding one.'
+ accepted=.false.
+ similar=.true.
+ else
+C Else carry out Metropolis test.
+ EneLower=.false.
+ xx=ran_number(0.0D0,1.0D0)
+ xxh=betbol*difene
+ if (lprn)
+ & write (iout,*) 'betbol=',betbol,' difene=',difene,' xxh=',xxh
+ if (xxh.gt.50.0D0) then
+ bol=0.0D0
+ else
+ bol=exp(-xxh)
+ endif
+ if (lprn) write (iout,*) 'bol=',bol,' xx=',xx
+ if (bol.gt.xx) then
+ accepted=.true.
+ if (lprn) write (iout,'(a)')
+ & 'Conformation accepted, because it passed Metropolis test.'
+ else
+ accepted=.false.
+ if (lprn) write (iout,'(a)')
+ & 'Conformation rejected, because it did not pass Metropolis test.'
+ endif
+ endif
+#ifdef AIX
+ call flush_(iout)
+#else
+ call flush(iout)
+#endif
+ return
+ end
+c------------------------------------------------------------------------------
+ integer function conf_comp(x,ene)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.MCM'
+ include 'COMMON.VAR'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.GEO'
+ double precision etol , angtol
+ double precision x(maxvar)
+ double precision dif_ang,difa
+ data etol /0.1D0/, angtol /20.0D0/
+ do ii=nsave,1,-1
+c write (iout,*) 'ii=',ii,'ene=',ene,esave(ii),dabs(ene-esave(ii))
+ if (dabs(ene-esave(ii)).lt.etol) then
+ difa=dif_ang(nphi,x,varsave(1,ii))
+c do i=1,nphi
+c write(iout,'(i3,3f8.3)')i,rad2deg*x(i),
+c & rad2deg*varsave(i,ii)
+c enddo
+c write(iout,*) 'ii=',ii,' difa=',difa,' angtol=',angtol
+ if (difa.le.angtol) then
+ if (print_mc.gt.0) then
+ write (iout,'(a,i5,2(a,1pe15.4))')
+ & 'Current conformation matches #',ii,
+ & ' in the store array ene=',ene,' esave=',esave(ii)
+c write (*,'(a,i5,a)') 'Current conformation matches #',ii,
+c & ' in the store array.'
+ endif ! print_mc.gt.0
+ if (print_mc.gt.1) then
+ do i=1,nphi
+ write(iout,'(i3,3f8.3)')i,rad2deg*x(i),
+ & rad2deg*varsave(i,ii)
+ enddo
+ endif ! print_mc.gt.1
+ nrepm=nrepm+1
+ conf_comp=ii
+ return
+ endif
+ endif
+ enddo
+ conf_comp=0
+ return
+ end
+C----------------------------------------------------------------------------
+ double precision function dif_ang(n,x,y)
+ implicit none
+ integer i,n
+ double precision x(n),y(n)
+ double precision w,wa,dif,difa
+ double precision pinorm
+ include 'COMMON.GEO'
+ wa=0.0D0
+ difa=0.0D0
+ do i=1,n
+ dif=dabs(pinorm(y(i)-x(i)))
+ if (dabs(dif-dwapi).lt.dif) dif=dabs(dif-dwapi)
+ w=1.0D0-(2.0D0*(i-1)/(n-1)-1.0D0)**2+1.0D0/n
+ wa=wa+w
+ difa=difa+dif*dif*w
+ enddo
+ dif_ang=rad2deg*dsqrt(difa/wa)
+ return
+ end
+c--------------------------------------------------------------------------
+ subroutine add2cache(n1,n2,ncache,nvar,SourceID,CachSrc,
+ & ecur,xcur,ecache,xcache)
+ implicit none
+ include 'COMMON.GEO'
+ include 'COMMON.IOUNITS'
+ integer n1,n2,ncache,nvar,SourceID,CachSrc(n2)
+ integer i,ii,j
+ double precision ecur,xcur(nvar),ecache(n2),xcache(n1,n2)
+cd write (iout,*) 'Enter ADD2CACHE ncache=',ncache ,' ecur',ecur
+cd write (iout,'(10f8.3)') (rad2deg*xcur(i),i=1,nvar)
+cd write (iout,*) 'Old CACHE array:'
+cd do i=1,ncache
+cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i)
+cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar)
+cd enddo
+
+ i=ncache
+ do while (i.gt.0 .and. ecur.lt.ecache(i))
+ i=i-1
+ enddo
+ i=i+1
+cd write (iout,*) 'i=',i,' ncache=',ncache
+ if (ncache.eq.n2) then
+ write (iout,*) 'Cache dimension exceeded',ncache,n2
+ write (iout,*) 'Highest-energy conformation will be removed.'
+ ncache=ncache-1
+ endif
+ do ii=ncache,i,-1
+ ecache(ii+1)=ecache(ii)
+ CachSrc(ii+1)=CachSrc(ii)
+ do j=1,nvar
+ xcache(j,ii+1)=xcache(j,ii)
+ enddo
+ enddo
+ ecache(i)=ecur
+ CachSrc(i)=SourceID
+ do j=1,nvar
+ xcache(j,i)=xcur(j)
+ enddo
+ ncache=ncache+1
+cd write (iout,*) 'New CACHE array:'
+cd do i=1,ncache
+cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i)
+cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar)
+cd enddo
+ return
+ end
+c--------------------------------------------------------------------------
+ subroutine rm_from_cache(i,n1,n2,ncache,nvar,CachSrc,ecache,
+ & xcache)
+ implicit none
+ include 'COMMON.GEO'
+ include 'COMMON.IOUNITS'
+ integer n1,n2,ncache,nvar,CachSrc(n2)
+ integer i,ii,j
+ double precision ecache(n2),xcache(n1,n2)
+
+cd write (iout,*) 'Enter RM_FROM_CACHE'
+cd write (iout,*) 'Old CACHE array:'
+cd do ii=1,ncache
+cd write (iout,*)'i=',ii,' ecache=',ecache(ii),' CachSrc',CachSrc(ii)
+cd write (iout,'(10f8.3)') (rad2deg*xcache(j,ii),j=1,nvar)
+cd enddo
+
+ do ii=i+1,ncache
+ ecache(ii-1)=ecache(ii)
+ CachSrc(ii-1)=CachSrc(ii)
+ do j=1,nvar
+ xcache(j,ii-1)=xcache(j,ii)
+ enddo
+ enddo
+ ncache=ncache-1
+cd write (iout,*) 'New CACHE array:'
+cd do i=1,ncache
+cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i)
+cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar)
+cd enddo
+ return
+ end