+++ /dev/null
- subroutine monte_carlo
-C Does Boltzmann and entropic sampling without energy minimization
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.IOUNITS'
-#ifdef MPL
- include 'COMMON.INFO'
-#endif
- include 'COMMON.GEO'
- include 'COMMON.CHAIN'
- include 'COMMON.MCM'
- include 'COMMON.MCE'
- include 'COMMON.CONTACTS'
- include 'COMMON.CONTROL'
- include 'COMMON.VAR'
- include 'COMMON.INTERACT'
- include 'COMMON.THREAD'
- include 'COMMON.NAMES'
- logical accepted,not_done,over,ovrtim,error,lprint
- integer MoveType,nbond,nbins
- integer conf_comp
- double precision RandOrPert
- double precision varia(maxvar),elowest,elowest1,
- & ehighest,ehighest1,eold
- double precision przes(3),obr(3,3)
- double precision varold(maxvar)
- logical non_conv
- integer moves1(-1:MaxMoveType+1,0:MaxProcs-1),
- & moves_acc1(-1:MaxMoveType+1,0:MaxProcs-1)
-#ifdef MPL
- double precision etot_temp,etot_all(0:MaxProcs)
- external d_vadd,d_vmin,d_vmax
- double precision entropy1(-max_ene:max_ene),
- & nhist1(-max_ene:max_ene)
- integer nbond_move1(maxres*(MaxProcs+1)),
- & nbond_acc1(maxres*(MaxProcs+1)),itemp(2)
-#endif
- double precision var_lowest(maxvar)
- double precision energia(0:n_ene),energia_ave(0:n_ene)
-C
- write(iout,'(a,i8,2x,a,f10.5)')
- & 'pool_read_freq=',pool_read_freq,' pool_fraction=',pool_fraction
- open (istat,file=statname)
- WhatsUp=0
- indminn=-max_ene
- indmaxx=max_ene
- facee=1.0D0/(maxacc*delte)
-C Number of bins in energy histogram
- nbins=e_up/delte-1
- write (iout,*) 'NBINS=',nbins
- conste=dlog(facee)
-C Read entropy from previous simulations.
- if (ent_read) then
- read (ientin,*) indminn,indmaxx,emin,emax
- print *,'indminn=',indminn,' indmaxx=',indmaxx,' emin=',emin,
- & ' emax=',emax
- do i=-max_ene,max_ene
- entropy(i)=0.0D0
- enddo
- read (ientin,*) (ijunk,ejunk,entropy(i),i=indminn,indmaxx)
- indmin=indminn
- indmax=indmaxx
- write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx,
- & ' emin=',emin,' emax=',emax
- write (iout,'(/a)') 'Initial entropy'
- do i=indminn,indmaxx
- write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i)
- enddo
- endif ! ent_read
-C Read the pool of conformations
- call read_pool
- elowest=1.0D+10
- ehighest=-1.0D+10
-C----------------------------------------------------------------------------
-C Entropy-sampling simulations with continually updated entropy;
-C set NSWEEP=1 for Boltzmann sampling.
-C Loop thru simulations
-C----------------------------------------------------------------------------
- DO ISWEEP=1,NSWEEP
-C
-C Initialize the IFINISH array.
-C
-#ifdef MPL
- do i=1,nctasks
- ifinish(i)=0
- enddo
-#endif
-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 shift (nbond_move(1)), spike, crankshaft, three-bond,...
-C motions.
- do i=1,nres
- nbond_move(i)=0
- nbond_acc(i)=0
- enddo
-C Initialize total and accepted number of moves of various kind.
- do i=-1,MaxMoveType
- moves(i)=0
- moves_acc(i)=0
- enddo
-C Total number of energy evaluations.
- neneval=0
- nfun=0
-C----------------------------------------------------------------------------
-C Take a conformation from the pool
-C----------------------------------------------------------------------------
- rewind(istat)
- write (iout,*) 'emin=',emin,' emax=',emax
- if (npool.gt.0) then
- ii=iran_num(1,npool)
- do i=1,nvar
- varia(i)=xpool(i,ii)
- enddo
- write (iout,*) 'Took conformation',ii,' from the pool energy=',
- & epool(ii)
- call var_to_geom(nvar,varia)
-C Print internal coordinates of the initial conformation
- call intout
- else if (isweep.gt.1) then
- if (eold.lt.emax) then
- do i=1,nvar
- varia(i)=varold(i)
- enddo
- else
- do i=1,nvar
- varia(i)=var_lowest(i)
- enddo
- endif
- call var_to_geom(nvar,varia)
- endif
-C----------------------------------------------------------------------------
-C Compute and print initial energies.
-C----------------------------------------------------------------------------
- nsave=0
- Kwita=0
- WhatsUp=0
- write (iout,'(/80(1h*)/a,i2/80(1h*)/)') 'MCE iteration #',isweep
- write (iout,'(/80(1h*)/a)') 'Initial energies:'
- call chainbuild
- call geom_to_var(nvar,varia)
- call etotal(energia(0))
- etot = energia(0)
- call enerprint(energia(0))
- 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
- write (istat,'(i10,16(1pe14.5))') 0,
- & (energia(print_order(i)),i=1,nprint_ene),
- & etot,rms,frac,co
- else
- write (istat,'(i10,14(1pe14.5))') 0,
- & (energia(print_order(i)),i=1,nprint_ene),etot
- endif
-c close(istat)
- neneval=neneval+1
- if (.not. ent_read) then
-C Initialize the entropy array
-#ifdef MPL
-C Collect total energies from other processors.
- etot_temp=etot
- etot_all(0)=etot
- call mp_gather(etot_temp,etot_all,8,MasterID,cgGroupID)
- if (MyID.eq.MasterID) then
-C Get the lowest and the highest energy.
- print *,'MASTER: etot_temp: ',(etot_all(i),i=0,nprocs-1),
- & ' emin=',emin,' emax=',emax
- emin=1.0D10
- emax=-1.0D10
- do i=0,nprocs
- if (emin.gt.etot_all(i)) emin=etot_all(i)
- if (emax.lt.etot_all(i)) emax=etot_all(i)
- enddo
- emax=emin+e_up
- endif ! MyID.eq.MasterID
- etot_all(1)=emin
- etot_all(2)=emax
- print *,'Processor',MyID,' calls MP_BCAST to send/recv etot_all'
- call mp_bcast(etot_all(1),16,MasterID,cgGroupID)
- print *,'Processor',MyID,' MP_BCAST to send/recv etot_all ended'
- if (MyID.ne.MasterID) then
- print *,'Processor:',MyID,etot_all(1),etot_all(2),
- & etot_all(1),etot_all(2)
- emin=etot_all(1)
- emax=etot_all(2)
- endif ! MyID.ne.MasterID
- write (iout,*) 'After MP_GATHER etot_temp=',
- & etot_temp,' emin=',emin
-#else
- emin=etot
- emax=emin+e_up
- indminn=0
- indmin=0
-#endif
- IF (MULTICAN) THEN
-C Multicanonical sampling - start from Boltzmann distribution
- do i=-max_ene,max_ene
- entropy(i)=(emin+i*delte)*betbol
- enddo
- ELSE
-C Entropic sampling - start from uniform distribution of the density of states
- do i=-max_ene,max_ene
- entropy(i)=0.0D0
- enddo
- ENDIF ! MULTICAN
- write (iout,'(/a)') 'Initial entropy'
- do i=indminn,indmaxx
- write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i)
- enddo
- if (isweep.eq.1) then
- emax=emin+e_up
- indminn=0
- indmin=0
- indmaxx=indminn+nbins
- indmax=indmaxx
- endif ! isweep.eq.1
- endif ! .not. ent_read
-#ifdef MPL
- call recv_stop_sig(Kwita)
- if (whatsup.eq.1) then
- call send_stop_sig(-2)
- not_done=.false.
- else if (whatsup.le.-2) then
- not_done=.false.
- else if (whatsup.eq.2) then
- not_done=.false.
- else
- not_done=.true.
- endif
-#else
- not_done=.true.
-#endif
- write (iout,'(/80(1h*)/20x,a/80(1h*))')
- & 'Enter Monte Carlo procedure.'
- close(igeom)
- call briefout(0,etot)
- do i=1,nvar
- varold(i)=varia(i)
- enddo
- eold=etot
- call entropia(eold,sold,indeold)
-C NACC is the counter for the accepted conformations of a given processor
- nacc=0
-C NACC_TOT counts the total number of accepted conformations
- nacc_tot=0
-C Main loop.
-c----------------------------------------------------------------------------
-C Zero out average energies
- do i=0,n_ene
- energia_ave(i)=0.0d0
- enddo
-C Initialize energy histogram
- do i=-max_ene,max_ene
- nhist(i)=0.0D0
- enddo ! i
-C Zero out iteration counter.
- it=0
- do j=1,nvar
- varold(j)=varia(j)
- enddo
-C Begin MC iteration loop.
- do while (not_done)
- it=it+1
-C Initialize local counter.
- ntrial=0 ! # of generated non-overlapping confs.
- noverlap=0 ! # of overlapping confs.
- accepted=.false.
- do while (.not. accepted .and. WhatsUp.eq.0 .and. Kwita.eq.0)
- ntrial=ntrial+1
-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
- MoveType=0
- nbond=0
- lprint=.true.
-C Decide whether to take a conformation from the pool or generate/perturb one
-C randomly
- from_pool=ran_number(0.0D0,1.0D0)
- if (npool.gt.0 .and. from_pool.lt.pool_fraction) then
-C Throw a dice to choose the conformation from the pool
- ii=iran_num(1,npool)
- do i=1,nvar
- varia(i)=xpool(i,ii)
- enddo
- call var_to_geom(nvar,varia)
- call chainbuild
-cd call intout
-cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar)
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a,i3,a,f10.5)')
- & 'Try conformation',ii,' from the pool energy=',epool(ii)
- MoveType=-1
- moves(-1)=moves(-1)+1
- else
-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 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a)') 'Perturbation-generated conformation.'
- call perturb(error,lprint,MoveType,nbond,0.1D0)
- 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 .and. (it/print_freq)*print_freq.eq.it)
- & 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)
- endif ! pool
-Cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar)
- ngen=ngen+1
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a,i5,a,i10,a,i10)')
- & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (*,'(a,i5,a,i10,a,i10)')
- & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen
- call etotal(energia(0))
- etot = energia(0)
- neneval=neneval+1
-cd call enerprint(energia(0))
-cd write(iout,*)'it=',it,' etot=',etot
- if (etot-elowest.gt.overlap_cut) then
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a,i5,a,1pe14.5)') 'Iteration',it,
- & ' Overlap detected in the current conf.; energy is',etot
- accepted=.false.
- noverlap=noverlap+1
- if (noverlap.gt.maxoverlap) then
- write (iout,'(a)') 'Too many overlapping confs.'
- goto 20
- endif
- else
-C--------------------------------------------------------------------------
-C... Acceptance test
-C--------------------------------------------------------------------------
- accepted=.false.
- if (WhatsUp.eq.0)
- & call accept_mc(it,etot,eold,scur,sold,varia,varold,accepted)
- if (accepted) then
- nacc=nacc+1
- nacc_tot=nacc_tot+1
- if (elowest.gt.etot) then
- elowest=etot
- do i=1,nvar
- var_lowest(i)=varia(i)
- enddo
- endif
- if (ehighest.lt.etot) ehighest=etot
- moves_acc(MoveType)=moves_acc(MoveType)+1
- if (MoveType.eq.1) then
- nbond_acc(nbond)=nbond_acc(nbond)+1
- endif
-C Compare with reference structure.
- 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)
- endif ! refstr
-C
-C Periodically save average energies and confs.
-C
- do i=0,n_ene
- energia_ave(i)=energia_ave(i)+energia(i)
- enddo
- moves(MaxMoveType+1)=nmove
- moves_acc(MaxMoveType+1)=nacc
- IF ((it/save_frequency)*save_frequency.eq.it) THEN
- do i=0,n_ene
- energia_ave(i)=energia_ave(i)/save_frequency
- enddo
- etot_ave=energia_ave(0)
-C#ifdef AIX
-C open (istat,file=statname,position='append')
-C#else
-C open (istat,file=statname,access='append')
-Cendif
- if (print_mc.gt.0)
- & write (iout,'(80(1h*)/20x,a,i20)')
- & 'Iteration #',it
- if (refstr .and. print_mc.gt.0) then
- 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
- if (print_stat) then
- if (refstr) then
- write (istat,'(i10,10(1pe14.5))') it,
- & (energia_ave(print_order(i)),i=1,nprint_ene),
- & etot_ave,rms_ave,frac_ave
- else
- write (istat,'(i10,10(1pe14.5))') it,
- & (energia_ave(print_order(i)),i=1,nprint_ene),
- & etot_ave
- endif
- endif
-c close(istat)
- if (print_mc.gt.0)
- & call statprint(nacc,nfun,iretcode,etot,elowest)
-C Print internal coordinates.
- if (print_int) call briefout(nacc,etot)
- do i=0,n_ene
- energia_ave(i)=0.0d0
- enddo
- ENDIF ! ( (it/save_frequency)*save_frequency.eq.it)
-C Update histogram
- inde=icialosc((etot-emin)/delte)
- nhist(inde)=nhist(inde)+1.0D0
-#ifdef MPL
- if ( (it/message_frequency)*message_frequency.eq.it
- & .and. (MyID.ne.MasterID) ) then
- call recv_stop_sig(Kwita)
- call send_MCM_info(message_frequency)
- endif
-#endif
-C Store the accepted conf. and its energy.
- eold=etot
- sold=scur
- do i=1,nvar
- varold(i)=varia(i)
- enddo
-#ifdef MPL
- if (Kwita.eq.0) call recv_stop_sig(kwita)
-#endif
- endif ! accepted
- endif ! overlap
-#ifdef MPL
- if (MyID.eq.MasterID .and.
- & (it/message_frequency)*message_frequency.eq.it) then
- call receive_MC_info
- if (nacc_tot.ge.maxacc) accepted=.true.
- endif
-#endif
-C if ((ntrial.gt.maxtrial_iter
-C & .or. (it/pool_read_freq)*pool_read_freq.eq.it)
-C & .and. npool.gt.0) then
-C Take a conformation from the pool
-C ii=iran_num(1,npool)
-C do i=1,nvar
-C varold(i)=xpool(i,ii)
-C enddo
-C if (ntrial.gt.maxtrial_iter)
-C & write (iout,*) 'Iteration',it,' max. # of trials exceeded.'
-C write (iout,*)
-C & 'Take conformation',ii,' from the pool energy=',epool(ii)
-C if (print_mc.gt.2)
-C & write (iout,'(10f8.3)') (rad2deg*varold(i),i=1,nvar)
-C ntrial=0
-C eold=epool(ii)
-C call entropia(eold,sold,indeold)
-C accepted=.true.
-C endif ! (ntrial.gt.maxtrial_iter .and. npool.gt.0)
- 30 continue
- enddo ! accepted
-#ifdef MPL
- if (MyID.eq.MasterID .and.
- & (it/message_frequency)*message_frequency.eq.it) then
- call receive_MC_info
- endif
- if (Kwita.eq.0) call recv_stop_sig(kwita)
-#endif
- if (ovrtim()) WhatsUp=-1
-cd write (iout,*) 'WhatsUp=',WhatsUp,' Kwita=',Kwita
- not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0)
- & .and. (Kwita.eq.0)
-cd write (iout,*) 'not_done=',not_done
-#ifdef MPL
- if (Kwita.lt.0) then
- print *,'Processor',MyID,
- & ' has received STOP signal =',Kwita,' in EntSamp.'
-cd print *,'not_done=',not_done
- if (Kwita.lt.-1) WhatsUp=Kwita
- if (MyID.ne.MasterID) call send_MCM_info(-1)
- else if (nacc_tot.ge.maxacc) then
- print *,'Processor',MyID,' calls send_stop_sig,',
- & ' because a sufficient # of confs. have been collected.'
-cd print *,'not_done=',not_done
- call send_stop_sig(-1)
- if (MyID.ne.MasterID) call send_MCM_info(-1)
- else if (WhatsUp.eq.-1) then
- print *,'Processor',MyID,
- & ' calls send_stop_sig because of timeout.'
-cd print *,'not_done=',not_done
- call send_stop_sig(-2)
- if (MyID.ne.MasterID) call send_MCM_info(-1)
- endif
-#endif
- enddo ! not_done
-
-C-----------------------------------------------------------------
-C... Construct energy histogram & update entropy
-C-----------------------------------------------------------------
- go to 21
- 20 WhatsUp=-3
-#ifdef MPL
- write (iout,*) 'Processor',MyID,
- & ' is broadcasting ERROR-STOP signal.'
- write (*,*) 'Processor',MyID,
- & ' is broadcasting ERROR-STOP signal.'
- call send_stop_sig(-3)
- if (MyID.ne.MasterID) call send_MCM_info(-1)
-#endif
- 21 continue
- write (iout,'(/a)') 'Energy histogram'
- do i=-100,100
- write (iout,'(i5,2f20.5)') i,emin+i*delte,nhist(i)
- enddo
-#ifdef MPL
-C Wait until every processor has sent complete MC info.
- if (MyID.eq.MasterID) then
- not_done=.true.
- do while (not_done)
-C write (*,*) 'The IFINISH array:'
-C write (*,*) (ifinish(i),i=1,nctasks)
- not_done=.false.
- do i=2,nctasks
- not_done=not_done.or.(ifinish(i).ge.0)
- enddo
- if (not_done) call receive_MC_info
- enddo
- endif
-C Make collective histogram from the work of all processors.
- msglen=(2*max_ene+1)*8
- print *,
- & 'Processor',MyID,' calls MP_REDUCE to send/receive histograms',
- & ' msglen=',msglen
- call mp_reduce(nhist,nhist1,msglen,MasterID,d_vadd,
- & cgGroupID)
- print *,'Processor',MyID,' MP_REDUCE accomplished for histogr.'
- do i=-max_ene,max_ene
- nhist(i)=nhist1(i)
- enddo
-C Collect min. and max. energy
- print *,
- &'Processor',MyID,' calls MP_REDUCE to send/receive energy borders'
- call mp_reduce(elowest,elowest1,8,MasterID,d_vmin,cgGroupID)
- call mp_reduce(ehighest,ehighest1,8,MasterID,d_vmax,cgGroupID)
- print *,'Processor',MyID,' MP_REDUCE accomplished for energies.'
- IF (MyID.eq.MasterID) THEN
- elowest=elowest1
- ehighest=ehighest1
-#endif
- write (iout,'(a,i10)') '# of accepted confs:',nacc_tot
- write (iout,'(a,f10.5,a,f10.5)') 'Lowest energy:',elowest,
- & ' Highest energy',ehighest
- indmin=icialosc((elowest-emin)/delte)
- imdmax=icialosc((ehighest-emin)/delte)
- if (indmin.lt.indminn) then
- emax=emin+indmin*delte+e_up
- indmaxx=indmin+nbins
- indminn=indmin
- endif
- if (.not.ent_read) ent_read=.true.
- write(iout,*)'indminn=',indminn,' indmaxx=',indmaxx
-C Update entropy (density of states)
- do i=indmin,indmax
- if (nhist(i).gt.0) then
- entropy(i)=entropy(i)+dlog(nhist(i)+0.0D0)
- endif
- enddo
- write (iout,'(/80(1h*)/a,i2/80(1h*)/)')
- & 'End of macroiteration',isweep
- write (iout,'(a,f10.5,a,f10.5)') 'Elowest=',elowest,
- & ' Ehighest=',ehighest
- write (iout,'(/a)') 'Energy histogram'
- do i=indminn,indmaxx
- write (iout,'(i5,2f20.5)') i,emin+i*delte,nhist(i)
- enddo
- write (iout,'(/a)') 'Entropy'
- do i=indminn,indmaxx
- write (iout,'(i5,2f20.5)') i,emin+i*delte,entropy(i)
- enddo
-C-----------------------------------------------------------------
-C... End of energy histogram construction
-C-----------------------------------------------------------------
-#ifdef MPL
- ELSE
- if (.not. ent_read) ent_read=.true.
- ENDIF ! MyID .eq. MaterID
- if (MyID.eq.MasterID) then
- itemp(1)=indminn
- itemp(2)=indmaxx
- endif
- print *,'before mp_bcast processor',MyID,' indminn=',indminn,
- & ' indmaxx=',indmaxx,' itemp=',itemp(1),itemp(2)
- call mp_bcast(itemp(1),8,MasterID,cgGroupID)
- call mp_bcast(emax,8,MasterID,cgGroupID)
- print *,'after mp_bcast processor',MyID,' indminn=',indminn,
- & ' indmaxx=',indmaxx,' itemp=',itemp(1),itemp(2)
- if (MyID .ne. MasterID) then
- indminn=itemp(1)
- indmaxx=itemp(2)
- endif
- msglen=(indmaxx-indminn+1)*8
- print *,'processor',MyID,' calling mp_bcast msglen=',msglen,
- & ' indminn=',indminn,' indmaxx=',indmaxx,' isweep=',isweep
- call mp_bcast(entropy(indminn),msglen,MasterID,cgGroupID)
- IF(MyID.eq.MasterID .and. .not. ovrtim() .and. WhatsUp.ge.0)THEN
- open (ientout,file=entname,status='unknown')
- write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax
- do i=indminn,indmaxx
- write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i)
- enddo
- close(ientout)
- ELSE
- write (iout,*) 'Received from master:'
- write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx,
- & ' emin=',emin,' emax=',emax
- write (iout,'(/a)') 'Entropy'
- do i=indminn,indmaxx
- write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i)
- enddo
- ENDIF ! MyID.eq.MasterID
- print *,'Processor',MyID,' calls MP_GATHER'
- call mp_gather(nbond_move,nbond_move1,4*Nbm,MasterID,
- & cgGroupID)
- call mp_gather(nbond_acc,nbond_acc1,4*Nbm,MasterID,
- & cgGroupID)
- print *,'Processor',MyID,' MP_GATHER call accomplished'
- if (MyID.eq.MasterID) then
-
- write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:'
- call statprint(nacc_tot,nfun,iretcode,etot,elowest)
- write (iout,'(a)')
- & 'Statistics of multiple-bond motions. Total motions:'
- write (iout,'(8i10)') (nbond_move(i),i=1,Nbm)
- write (iout,'(a)') 'Accepted motions:'
- write (iout,'(8i10)') (nbond_acc(i),i=1,Nbm)
-
- write (iout,'(a)')
- & 'Statistics of multi-bond moves of respective processors:'
- do iproc=1,Nprocs-1
- do i=1,Nbm
- ind=iproc*nbm+i
- nbond_move(i)=nbond_move(i)+nbond_move1(ind)
- nbond_acc(i)=nbond_acc(i)+nbond_acc1(ind)
- enddo
- enddo
- do iproc=0,NProcs-1
- write (iout,*) 'Processor',iproc,' nbond_move:',
- & (nbond_move1(iproc*nbm+i),i=1,Nbm),
- & ' nbond_acc:',(nbond_acc1(iproc*nbm+i),i=1,Nbm)
- enddo
- endif
- call mp_gather(moves,moves1,4*(MaxMoveType+3),MasterID,
- & cgGroupID)
- call mp_gather(moves_acc,moves_acc1,4*(MaxMoveType+3),
- & MasterID,cgGroupID)
- if (MyID.eq.MasterID) then
- do iproc=1,Nprocs-1
- do i=-1,MaxMoveType+1
- moves(i)=moves(i)+moves1(i,iproc)
- moves_acc(i)=moves_acc(i)+moves_acc1(i,iproc)
- enddo
- enddo
- nmove=0
- do i=0,MaxMoveType+1
- nmove=nmove+moves(i)
- enddo
- do iproc=0,NProcs-1
- write (iout,*) 'Processor',iproc,' moves',
- & (moves1(i,iproc),i=0,MaxMoveType+1),
- & ' moves_acc:',(moves_acc1(i,iproc),i=0,MaxMoveType+1)
- enddo
- endif
-#else
- open (ientout,file=entname,status='unknown')
- write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax
- do i=indminn,indmaxx
- write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i)
- enddo
- close(ientout)
-#endif
- write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:'
- call statprint(nacc_tot,nfun,iretcode,etot,elowest)
- write (iout,'(a)')
- & 'Statistics of multiple-bond motions. Total motions:'
- write (iout,'(8i10)') (nbond_move(i),i=1,Nbm)
- write (iout,'(a)') 'Accepted motions:'
- write (iout,'(8i10)') (nbond_acc(i),i=1,Nbm)
- if (ovrtim() .or. WhatsUp.lt.0) return
-
-C---------------------------------------------------------------------------
- ENDDO ! ISWEEP
-C---------------------------------------------------------------------------
-
- runtime=tcpu()
-
- if (isweep.eq.nsweep .and. it.ge.maxacc)
- &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.'
- return
- end
-c------------------------------------------------------------------------------
- subroutine accept_mc(it,ecur,eold,scur,sold,x,xold,accepted)
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.MCM'
- include 'COMMON.MCE'
- include 'COMMON.IOUNITS'
- include 'COMMON.VAR'
-#ifdef MPL
- include 'COMMON.INFO'
-#endif
- include 'COMMON.GEO'
- double precision ecur,eold,xx,ran_number,bol
- double precision x(maxvar),xold(maxvar)
- logical accepted
-C Check if the conformation is similar.
-cd write (iout,*) 'Enter ACCEPTING'
-cd write (iout,*) 'Old PHI angles:'
-cd write (iout,*) (rad2deg*xold(i),i=1,nphi)
-cd write (iout,*) 'Current angles'
-cd write (iout,*) (rad2deg*x(i),i=1,nphi)
-cd ddif=dif_ang(nphi,x,xold)
-cd write (iout,*) 'Angle norm:',ddif
-cd write (iout,*) 'ecur=',ecur,' emax=',emax
- if (ecur.gt.emax) then
- accepted=.false.
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a)') 'Conformation rejected as too high in energy'
- return
- endif
-C Else evaluate the entropy of the conf and compare it with that of the previous
-C one.
- call entropia(ecur,scur,indecur)
-cd print *,'Processor',MyID,' ecur=',ecur,' indecur=',indecur,
-cd & ' scur=',scur,' eold=',eold,' sold=',sold
-cd print *,'deix=',deix,' dent=',dent,' delte=',delte
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) then
- write(iout,*)'it=',it,'ecur=',ecur,' indecur=',indecur,
- & ' scur=',scur
- write(iout,*)'eold=',eold,' sold=',sold
- endif
- if (scur.le.sold) then
- accepted=.true.
- else
-C Else carry out acceptance test
- xx=ran_number(0.0D0,1.0D0)
- xxh=scur-sold
- if (xxh.gt.50.0D0) then
- bol=0.0D0
- else
- bol=exp(-xxh)
- endif
- if (bol.gt.xx) then
- accepted=.true.
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a)') 'Conformation accepted.'
- else
- accepted=.false.
- if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it)
- & write (iout,'(a)') 'Conformation rejected.'
- endif
- endif
- return
- end
-c--------------------------------------------------------------------------
- integer function icialosc(x)
- double precision x
- if (x.lt.0.0D0) then
- icialosc=dint(x)-1
- else
- icialosc=dint(x)
- endif
- return
- end
-c--------------------------------------------------------------------------
- subroutine entropia(ecur,scur,indecur)
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.MCM'
- include 'COMMON.MCE'
- include 'COMMON.IOUNITS'
- double precision ecur,scur
- integer indecur
- indecur=icialosc((ecur-emin)/delte)
- if (iabs(indecur).gt.max_ene) then
- if ((it/print_freq)*it.eq.it) write (iout,'(a,2i5)')
- & 'Accepting: Index out of range:',indecur
- scur=1000.0D0
- else if (indecur.ge.indmaxx) then
- scur=entropy(indecur)
- if (print_mc.gt.0 .and. (it/print_freq)*it.eq.it)
- & write (iout,*)'Energy boundary reached',
- & indmaxx,indecur,entropy(indecur)
- else
- deix=ecur-(emin+indecur*delte)
- dent=entropy(indecur+1)-entropy(indecur)
- scur=entropy(indecur)+(dent/delte)*deix
- endif
- return
- end