-#ifdef MPI
- Subroutine together
-c feeds tasks for parallel processing
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'mpif.h'
- real 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 tcpu
- double precision time_start,time_start_c,time0f,time0i
- logical ovrtim,sync_iter,timeout,flag,timeout1
- dimension muster(mpi_status_size)
- dimension t100(0:100),indx(mxio)
- dimension xout(maxvar),eout(mxch*(mxch+1)/2+1),ind(9)
- dimension cout(2)
- parameter (rad=1.745329252d-2)
-
-cccccccccccccccccccccccccccccccccccccccccccccccc
- 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)
-
-c To minimize input conformation (bank conformation)
-c 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
-c!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
-
-c ntrial : number of trial conformations per seed.
-c ntry : total number of trial conformations including seed conformations.
-
- idum2=-123
-#ifdef G77
- imax=2**30-1
-#else
- imax=2**31-1
-#endif
- ENDIF
-
- call mpi_bcast(jend,1,mpi_integer,0,CG_COMM,ierr)
-cccccccccccccccccccccccccccccccccccccccc
- do 300 jlee=1,jend
-cccccccccccccccccccccccccccccccccccccccc
- 331 continue
- IF (ME.EQ.KING) THEN
- if(sync_iter) goto 333
- idum=- ran2(idum2)*imax
- if(jlee.lt.jstart) goto 300
-
-C 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)
-
-cccccccccccccccccccccccccccccccccccccccccccccccc
- 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
-
-c start energy minimization
- nconfr=max0(nconf+nadd,nodes-1)
- if (sync_iter) nconf_in=0
-c king-emperor - feed input and sort output
- write (iout,*) "NCONF_IN",nconf_in
- m=0
- if (nconf_in.gt.0) then
-c 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)
-c 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
-c To minimize input conformation (bank conformation)
-c Output to $mol.reminimized
- if (irestart.lt.0) then
- call reminimize(jlee)
- return
- endif
- if (irestart.eq.1) goto 111
-c soldier - perform energy minimization
- 334 call minim_jlee
-
-
- ENDIF
-
-ccccccccccccccccccccccccccccccccccc
-c need to syncronize all procs
- call mpi_barrier(CG_COMM,ierr)
- if (ierr.ne.0) then
- print *, ' cannot synchronize MPI'
- stop
- endif
-ccccccccccccccccccccccccccccccccccc
-
- IF (ME.EQ.KING) THEN
-
-c print *,"ok after minim"
- nstep=nstep+nconf
- if(irestart.eq.2) then
- nbank=nbank+nconf
-c ntbank=ntbank+nconf
- if(ntbank.gt.ntbankm) ntbank=ntbankm
- endif
-c print *,"ok before indexx"
- if(iref.eq.0) then
- call indexx(nconfr,etot,indx)
- else
-c 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
-c cc/al
-c call indexx(nconfr,rmsn,indx)
- endif
-c 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)
-c!bankt btene(im)=etot(m)
-c
- 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)
-c!bankt btvar(i,j,k,im)=dihang(i,j,k,m)
-c
- 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
-
- if (tm_score) then
- call get_diff_p
- else
- call get_diff
- endif
- if(nbank.eq.nconf.and.irestart.eq.0) then
- adif=avedif
- endif
-
- write (iout,*) "AVEDIF",avedif
- cutdif=adif/cut1
- ctdif1=adif/cut2
-
-cd print *,"adif,xctdif,cutdifr"
-cd print *,adif,xctdif,cutdifr
- nst=ntotal/ntrial/nseed
- xctdif=(cutdif/ctdif1)**(-1.0/nst)
- if(irestart.ge.1) call estimate_cutdif(adif,xctdif,cutdifr)
-c print *,"ok after estimate"
-
- irestart=0
-
- call write_rbank(jlee,adif,nft)
- call write_bank(jlee,nft)
-c!bankt call write_bankt(jlee,nft)
-c 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
-ccccccccccccccccccccccccccccccccccccccc
- do while (.not. finished)
-ccccccccccccccccccccccccccccccccccccccc
-crc print *,"iter ", iter,' isent=',isent
-
- IF (ME.EQ.KING) THEN
-c start energy minimization
-
- if (isent.eq.0) then
-c king-emperor - select seeds & make var & feed input
-cd 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)
-cd 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
-
-crc write(iout,*)'1:Calling FEEDIN NTRY',NTRY,' ntrial',ntrial
-crc call feedin(ntry,nft)
-
- isent=isent+1
- if (isent.ge.nodes.or.iter.gt.0) then
-ct print *,'waiting ',MPI_WTIME()
- irecv=irecv+1
- call recv(0,ifrom,xout,eout,ind,timeout)
-ct print *,' ',irecv,' received from',ifrom,MPI_WTIME()
-
- if(tm_score) 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(tm_score.and.eout(1).lt.ebmax) then
- if(iref.eq.0 .or.
- & (rmsn(irecv).le.rmscut.and.pncn(irecv).ge.pnccut))
- & call refresh_bank_master_tmscore(ifrom,eout(1),irecv)
- endif
- else
- ifrom=ifrom+1
- endif
-
-ct print *,'sending to',ifrom,MPI_WTIME()
- call send(isent,ifrom,iter)
-ct print *,isent,' sent ',MPI_WTIME()
-
-c store results -----------------------------------------------
- if ((isent.ge.nodes.or.iter.gt.0).and..not.tm_score) 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
-c--------------------------------------------------------------
- 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
-c----------------- call update(ntry-nodes+1) -------------------
- nstep=nstep+ntry-nseed-(nodes-1)
- if (tm_score) then
-ctm call refresh_bank(ntry)
- call print_mv_stat
- 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
- else
- call refresh_bank(ntry-nodes+1)
- endif
-c!bankt call refresh_bankt(ntry-nodes+1)
- else
-c----------------- call update(ntry) ---------------------------
- iter=iter+1
- print *,'UPDATING ',ntry,irecv
- write(iout,*) 'UPDATING ',ntry
- nstep=nstep+ntry-nseed
- if (tm_score) then
-ctm call refresh_bank(ntry)
- call print_mv_stat
- 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
- else
- call refresh_bank(ntry)
- endif
-c!bankt call refresh_bankt(ntry)
- endif
-c-----------------------------------------------------------------
-
- call write_bank(jlee,nft)
-c!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
-c ibank(i)=2
- ibank(i)=1
- enddo
- nbank=nbank+nconf
- if(nbank.gt.nbankm) then
- nbank=nbank-nconf
- finished=.true.
- else
-crc 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)
-c!bankt call refresh_bankt(ij-1)
- goto 1002
- endif
-c 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
-crc 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
-
-ctimeout call mpi_bcast(finished,1,mpi_logical,0,CG_COMM,ierr)
-ctimeout call mpi_bcast(sync_iter,1,mpi_logical,0,
-ctimeout & 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)
-c!bankt call refresh_bankt(nodes-1)
- 1002 continue
- call write_bank(jlee,nft)
-c!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 =',f15.5,i7,i10)
-
- isent=0
- irecv=0
- endif
- ELSE
- if (tm_score) then
- call get_diff_p
- endif
-c 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)
-ctimeout call mpi_bcast(finished,1,mpi_logical,0,CG_COMM,ierr)
-ctimeout 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
-
-ccccccccccccccccccccccccccccccccccccccc
- enddo
-ccccccccccccccccccccccccccccccccccccccc
-
- 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
-
-cccccccccccccccccccccccccccccc
- 300 continue
-cccccccccccccccccccccccccccccc
-
- return
- end
-#else
- Subroutine together
-c feeds tasks for parallel processing
- implicit real*8 (a-h,o-z)
- include 'DIMENSIONS'
- include 'COMMON.IOUNITS'
- write (iout,*) "Unsupported option for the serial version"
- return
- end
-#endif
-#ifdef MPI
-c-------------------------------------------------
- subroutine feedin(nconf,nft)
-c 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'
- dimension xin(maxvar),xout(maxvar),eout(mxch*(mxch+1)/2+1),
- * cout(2),ind(9),info(12)
- dimension muster(mpi_status_size)
- include 'COMMON.SETUP'
- parameter (rad=1.745329252d-2)
-
- print *,'FEEDIN: NCONF=',nconf
- mm=0
-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
- 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
-c 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
-c 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
-c 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)
-c 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
-c 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)
-c 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
-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
-c no more input
-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
- do j=1,nodes-1
-c wait for a soldier
- call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint,
- * CG_COMM,muster,ierr)
-crc if (ierr.ne.0) go to 30
-! print *, ' receiving output from start # ',ind(1)
- man=muster(mpi_source)
-c 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
-crc if (ierr.ne.0) go to 30
- call mpi_recv(xout,nvar,mpi_double_precision,
- * man,idreal,CG_COMM,muster,ierr)
-! print *,nvar , ierr
-crc if (ierr.ne.0) go to 30
-c 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)
-c 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
-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
- 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
-cccccccccccccccccccccccccccccccccccccccccccccccccc
- subroutine getx(ind,xout,eout,cout,rad,iw_pdb,k)
-c 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'
- dimension ind(9),xout(maxvar),eout(mxch*(mxch+1)/2+1)
- dimension cout(2)
-cjlee
- double precision przes(3),obr(3,3)
- logical non_conv
-cjlee
- 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
-c store ind()
- do j=1,9
- indb(k,j)=ind(j)
- enddo
-c store energies
- etot(k)=eout(1)
-c 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
-cjlee
- if(iref.eq.0) then
- iw_pdb=1
-cd write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4)')
-cd & ind(2),' e ',ind(3),ind(1),' etot ',etot(k),' mv ',
-cd & ind(5),ind(4)
- return
- endif
- call chainbuild
-c call dihang_to_c(dihang(1,1,1,k))
-c call fitsq(rms,c(1,1),crefjlee(1,1),nres,przes,obr,non_conv)
-c call fitsq(rms,c(1,2),crefjlee(1,2),nres-1,przes,obr,non_conv)
-c call fitsq(rms,c(1,nstart_seq),crefjlee(1,nstart_sup),
-c & nsup,przes,obr,non_conv)
-c 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)
-
-cd write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a5
-cd & ,0pf5.2,a5,f5.1,a,f6.3,a4,i3,i4)')
-cd & ind(2),' e ',ind(3),ind(1),' etot ',etot(k),' rms ',
-cd & rmsn(k),' %NC ',pncn(k)*100,' cont.order',co,' mv ',
-cd & ind(5),ind(4)
-
-
- if (rmsn(k).gt.rmscut.or.pncn(k).lt.pnccut) iw_pdb=0
- return
- end
-cccccccccccccccccccccccccccccccccccccccccccccccccc
- subroutine putx(xin,n,rad)
-c 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'
- dimension xin(maxvar)
-
-c 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
-c 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
-c--------------------------------------------------------
- subroutine putx2(xin,iff,n)
-c 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'
- dimension xin(maxvar),iff(maxres)
-
-c 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
-c set up array of variables
- call geom_to_var(nvar,xin)
-
- do i=1,nres
- iff(i)=iff_in(i,n)
- enddo
- return
- end
-
-c-------------------------------------------------------
- subroutine prune_bank(p_cut)
- 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'
-c---------------------------
-c This subroutine prunes bank conformations using p_cut
-c---------------------------
-
- 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
-c-------------------------------------------------------
-
- subroutine reminimize(jlee)
- 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'
-c---------------------------
-c This subroutine re-minimizes bank conformations:
-c---------------------------
-
- 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)
-c 850 format(10f8.3)
-
- return
- end
-c-------------------------------------------------------
- subroutine send(n,mm,it)
-c 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'
- dimension xin(maxvar),xout(maxvar),eout(mxch*(mxch+1)/2+1),
- * cout(2),ind(8),xin2(maxvar),iff(maxres),info(12)
- dimension muster(mpi_status_size)
- include 'COMMON.SETUP'
- parameter (rad=1.745329252d-2)
-
- if (isend2(n).eq.0) then
-c 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
-c 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
-c-------------------------------------------------
-
- subroutine recv(ihalt,man,xout,eout,ind,tout)
-c 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'
- dimension xin(maxvar),xout(maxvar),eout(mxch*(mxch+1)/2+1),
- * cout(2),ind(9),info(12)
- dimension muster(mpi_status_size)
- include 'COMMON.SETUP'
- logical tout,flag
- double precision twait,tstart,tend1
- parameter(twait=600.0d0)
-
-c 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.
-c_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)
-
-ctimeout call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint,
-ctimeout * CG_COMM,muster,ierr)
-! print *, ' receiving output from start # ',ind(1)
-ct print *,'receiving ',MPI_WTIME()
-ctimeout man=muster(mpi_source)
- call mpi_recv(ind,9,mpi_integer,man,idint,
- * CG_COMM,muster,ierr)
-ctimeout
-c 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
-c halt soldier
- if(ihalt.eq.1) then
-c print *,'sending halt to ',man
- write(iout,*) 'sending halt to ',man
- info(1)=0
- info(2)=0
- call mpi_send(info,12,mpi_integer,man,idint,CG_COMM,ierr)
- endif
- return
- end
-
-c----------------------------------------------------------
- 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
-#endif