⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tranal.f

📁 分子动力学模拟程序
💻 F
📖 第 1 页 / 共 5 页
字号:
		  XAV(I2)=XAV(I2)+XL2		  YAV(I2)=YAV(I2)+YL2		  ZAV(I2)=ZAV(I2)+ZL2	if(IPRINT.ge.7)     +  write(*,'(3I5,a4,3f9.3)')I,ISS3,ICS,NM(NSITE(ISS3)),XL2,YL2,ZL2	          XAV2(I2)=XAV2(I2)+XL2**2	          YAV2(I2)=YAV2(I2)+YL2**2	          ZAV2(I2)=ZAV2(I2)+ZL2**2		  IAA(I1)=IAA(I1)+1		  IAA(I2)=IAA(I2)+1		  I=I+2		  go to 10	       end if     ! (RR2.lt.RR1.and.RR2.lt.RR3	     else if((RR1+RR21).gt.(RR2+RR11)) then  !   ISREP=2,  1 <-> 2	       I1=I+1	       XAV(I1)=XAV(I1)+XL	       YAV(I1)=YAV(I1)+YL	       ZAV(I1)=ZAV(I1)+ZL	       if(IPRINT.ge.7)     + write(*,'(2I5,a4,3f9.3)')I1,ISS2,NM(NSITE(ISS2)),XL,YL,ZL	       XAV2(I1)=XAV2(I1)+XL**2	       YAV2(I1)=YAV2(I1)+YL**2	       ZAV2(I1)=ZAV2(I1)+ZL**2	       XAV(I)=XAV(I)+XL2	       YAV(I)=YAV(I)+YL2	       ZAV(I)=ZAV(I)+ZL2	if(IPRINT.ge.7)write(*,'(2I5,a4,3f9.3)')     +I,IS,NM(NSITE(IS)),XL2,YL2,ZL2	       XAV2(I)=XAV2(I)+XL2**2	       YAV2(I)=YAV2(I)+YL2**2	       ZAV2(I)=ZAV2(I)+ZL2**2	       IAA(I)=IAA(I)+1	       IAA(I1)=IAA(I1)+1	       I=I+1	       go to 10	     end if   !  ISEP.eq.3	   end if     !  ISEP.ne.1	   XAV(I)=XAV(I)+XL	   YAV(I)=YAV(I)+YL	   ZAV(I)=ZAV(I)+ZL	   if(IPRINT.ge.7)write(*,'(2I5,a4,3f9.3)')     +I,IS,NM(NSITE(IS)),XL,YL,ZL	   XAV2(I)=XAV2(I)+XL**2	   YAV2(I)=YAV2(I)+YL**2	   ZAV2(I)=ZAV2(I)+ZL**2	   IAA(I)=IAA(I)+1 10	   I=I+1	   go to 5*	end do 20	   return	end*          *========================= DIFFUS ======================================*      subroutine DIFFUS      include 'tranal.h'      data IREC/1/,IINIT/0/,JINIT/0/*  calculation of diffusion coefficients       ITYP		= IDF      N           = ISADDR(ITYP)      I           = IADDR(ITYP)      IML=NSPEC(ITYP)	XCM=0.	YCM=0.	ZCM=0.      if(IML.gt.MAXMOL)IML=MAXMOL      DO J        = 1,IML   ! sum over molecules	NSADR=ISADDR(ITYP)+NSITS(ITYP)*(J-1)+IAT        I           = I+1        XX       = SX(NSADR)        YY       = SY(NSADR)        ZZ       = SZ(NSADR)**Calculate C.O.M. vectors relative to the first atom:**        DO IS       = NSBEG,NSEND**          N           = N+1**          XX       = XX+MASS(IS)*SX(N)**          YY       = YY+MASS(IS)*SY(N)**          ZZ       = ZZ+MASS(IS)*SZ(N)**        END DO! OF IS        XX       = XX+ISHX(J)*BOXL        YY       = YY+ISHY(J)*BOYL        ZZ       = ZZ+ISHZ(J)*BOZL*  PBC**(-1)	  if(IINIT.ne.0.or.IREC.ne.1)then	    IREC1=IREC-1	    if(IREC1.le.0)IREC1=IREC1+MTR 	    if(XX-TRCX(IREC1,J).gt. HBOXL)then	      ISHX(J)=ISHX(J)-1	      XX=XX-BOXL	    end if	    if(XX-TRCX(IREC1,J).lt.-HBOXL)then	      ISHX(J)=ISHX(J)+1	      XX=XX+BOXL	    end if	    if(YY-TRCY(IREC1,J).gt. HBOYL)then	      ISHY(J)=ISHY(J)-1	      YY=YY-BOYL	    end if	    if(YY-TRCY(IREC1,J).lt.-HBOYL)then	      ISHY(J)=ISHY(J)+1	      YY=YY+BOYL	    end if	    if(ZZ-TRCZ(IREC1,J).gt. HBOZL)then	      ISHZ(J)=ISHZ(J)-1	      ZZ=ZZ-BOZL	    end if	    if(ZZ-TRCZ(IREC1,J).lt.-HBOZL)then	      ISHZ(J)=ISHZ(J)+1	      ZZ=ZZ+BOZL	    end if	  end if	  *  remember 	  TRCX(IREC,J)=XX	  	  TRCY(IREC,J)=YY	  	  TRCZ(IREC,J)=ZZ  	  JM=J	  XCM=XCM+XX	  YCM=YCM+YY	  ZCM=ZCM+ZZ      END DO! OF J      XCM=XCM/IML      YCM=YCM/IML      ZCM=ZCM/IML	if(JINIT.eq.0)then	   XCM0=XCM	   YCM0=YCM	   ZCM0=ZCM	   JINIT=1	end if      TTIM(IREC)=FULTIM*1.d-12            ! in  s*      if(IPRINT.ge.6)write(*,'(4f10.3,I7,2x,3I3)')*     +FULTIM,TRCX(IREC,ICNT),TRCY(IREC,ICNT),TRCZ(IREC,ICNT),*     +IREC,ISHX(ICNT),ISHY(ICNT),ISHZ(ICNT)	if(IPRINT.ge.6)write(*,'(f12.1,3f12.6)')     +    FULTIM,XCM-XCM0,YCM-YCM0,ZCM-ZCM0*  calculate <R(t)-R(0)>	IRB=IREC  	IRB1=IRB+1	if(IRB1.gt.MTR)IRB1=1	IROUND=0	do ITM=1,NTT	  TBACK=FULTIM*1.d-12-ITM*DTT*	  write(*,*)ITM,FULTIM,TBACK*1.d12,IRB,TTIM(IRB)*1.d12,IRB1,*     + TTIM(IRB1)*1.d12 10	  if(TTIM(IRB).le.TBACK)then	    if(TTIM(IRB1)-TTIM(IRB).lt.5.*DTT)then	    AL=(TBACK-TTIM(IRB))/(TTIM(IRB1)-TTIM(IRB))      	    if(AL.lt.0.d0.or.AL.gt.1.d0)write(*,'(a,f9.5,I7,3e14.5)')     +  ' strange ALPHA: ',AL,IRB,TTIM(IRB),TBACK,TTIM(IRB1)            DO J        = 1,IML   ! sum over molecules	      X0=TRCX(IRB,J)*(1.-AL)+TRCX(IRB1,J)*AL	      Y0=TRCY(IRB,J)*(1.-AL)+TRCY(IRB1,J)*AL	      Z0=TRCZ(IRB,J)*(1.-AL)+TRCZ(IRB1,J)*AL	      RAX=(X0-TRCX(IREC,J))**2	      RAY=(Y0-TRCY(IREC,J))**2	      RAZ=(Z0-TRCZ(IREC,J))**2	      RR=RAX+RAY+RAZ	      RCUMX(ITM)=RCUMX(ITM)+RAX	      RCUMY(ITM)=RCUMY(ITM)+RAY	      RCUMZ(ITM)=RCUMZ(ITM)+RAZ	      RCUM(ITM)=RCUM(ITM)+RR	      NCUM(ITM)=NCUM(ITM)+1  	      if(IPRINT.ge.8)write(*,'(2I6,2f12.6)')     +      ITM,J,ITM*DTT*1.d12,sqrt(RR)	    end do   	    end if	  else	    IRB1=IRB	    IRB=IRB-1	    if(IRB.le.0)then	      if(IINIT.eq.0)go to 30	      IRB=MTR	      IROUND=1	    end if	    if(IRB.le.IREC.and.IROUND.eq.1)go to 30	    go to 10	  end if	end do ! of ITM 30	IREC=IREC+1	if(IREC.gt.MTR)then	  IREC=1	  IINIT=1	end if	return	end   **==================== RESTIM ==========================================*                                                                      	subroutine RESTIM(IMD)	include 'tranal.h'	real*4 TIIN(NRT1M,NRT2M),TIINI(NRT1M,NRT2M),TIINO(NRT1M,NRT2M)	integer IRS(NRT1M,NRT2M)	data IINIT/0/	if(IINIT.eq.0)then	  IINIT=1	  do I=1,NRT1M	    do J=1,NRT2M	      IRS(I,J)=0	    end do	  end do 	end if 	if(IBREAK.ne.0)then	  do I=1,NRT1	    do J=1,NRT2	      IRS(I,J)=0	    end do	  end do 	  write(*,*)' residence time tables set to zero'	end if     *   over first set of sites	do I=1,NRT1	  ISP=IRS1(I)	  ITYP=ITYPE(ISP)	  IMOL=NNUM(ISP)	  if(LIST(ITYP).eq.0)return*   over second set of sites	  do J=1,NRT2	    JSP=IRS2(J) 	    JMOL=NNUM(JSP)	    if(IMOL.ne.JMOL)then	    JTYP=ITYPE(JSP)	    if(LIST(JTYP).eq.0)return	    if(ISP.eq.JSP)go to 90	    DX=SX(ISP)-SX(JSP)	    DY=SY(ISP)-SY(JSP)	    DZ=SZ(ISP)-SZ(JSP)	    call PBC(DX,DY,DZ)	    RR=sqrt(DX**2+DY**2+DZ**2)*  executed at the last call	    if(IMD.eq.1)then*  register all pairs which are still in contact	      if(mod(IRS(I,J),3).ne.0)then	        TIMR=(FULTIM*1.d-12-TIINI(I,J))*1.d12	        TIMRS2=TIMRS2+TIMR     ! register residence time 	        NR=TIMR*NITT/TIMM+1		write(*,*)' add ',TIMR,' ps  for ',I,J,' R=',RR	        if(NR.gt.0.and.NR.le.NITT)DIST2(NR)=DIST2(NR)+1 	        ITIR2=ITIR2+1	        if(TIMR.gt.TTER*1.d12)then	          TIMRS1=TIMRS1+TIMR	 	  ITIR1=ITIR1+1		end if	        TIMRS=TIMRS+TIMR     	        if(NR.gt.0.and.NR.le.NITT)DISTT(NR)=DISTT(NR)+1 	        ITIR=ITIR+1	      end if	      go to 90	    end if    ! IMD.eq.1	    if(IPRINT.ge.8)write(*,*)I,J,ISP,JSP,RR*  standard criteria (exit during short time not accounted) 15	    if(mod(IRS(I,J),3).eq.0)then *  bulk (0) -> enter hydrated shell (2)	      if(RR.gt.RRN.and.RR.lt.RRX)then		IRS(I,J)=IRS(I,J)+2	 	TIINI(I,J)=FULTIM*1.d-12          ! register entrance time	        if(IPRINT.ge.6)write(*,*)' new st',I,J	      end if   *  Temporarly out (1)	    else if(mod(IRS(I,J),3).eq.1)then *  Out more than cut-off time (TTER) -> bulk (0) 	      if(FULTIM*1.d-12-TIINO(I,J).gt.TTER)then	        IRS(I,J)=IRS(I,J)-1	        if(IPRINT.ge.6)write(*,*)' out st',I,J	        TIMR=(TIINO(I,J)-TIINI(I,J))*1.d12	        TIMRS2=TIMRS2+TIMR     ! register residence time 	        NR=TIMR*NITT/TIMM+1	        if(NR.gt.0.and.NR.le.NITT)DIST2(NR)=DIST2(NR)+1 	        ITIR2=ITIR2+1	        if(TIMR.gt.TTER*1.d12)then	          TIMRS1=TIMRS1+TIMR	 	  ITIR1=ITIR1+1		end if	 	go to 15	      end if	      if(RR.gt.RRN.and.RR.lt.RRX)IRS(I,J)=IRS(I,J)+1*  hydrated (2)	    else	      if(RR.le.RRN.or.RR.ge.RRX)then*  mark as temporarly out (1); register exit time 	        IRS(I,J)=IRS(I,J)-1	        TIINO(I,J)=FULTIM*1.d-12            end if	    end if	    *  alt. criteria (just register in - out )	     	    if(IRS(I,J).le.2)then* simple in	      if(RR.gt.RRNX.and.RR.lt.RRXN)then	        IRS(I,J)=IRS(I,J)+3	        TIIN(I,J)=FULTIM*1.d-12 	        if(IPRINT.ge.6)write(*,*)' new alt',I,J	      end if	    else* simple out    	      if(RR.lt.RRNN.or.RR.gt.RRXX)then 	        TIMR=(FULTIM*1.d-12-TIIN(I,J))*1.d12		IRS(I,J)=IRS(I,J)-3	        TIMRS=TIMRS+TIMR     	        NR=TIMR*NITT/TIMM+1	        if(NR.gt.0.and.NR.le.NITT)DISTT(NR)=DISTT(NR)+1 	        ITIR=ITIR+1	        if(IPRINT.ge.6)write(*,*)' out alt',I,J	      end if	    end if*  Count hydrated pairs	    if(mod(IRS(I,J),3).eq.2)IHP=IHP+1 90	    continue	  end if ! (IMOL.ne.JMOL	  end do	end do	if(IPRINT.ge.7)write(*,*)fultim,ITIR,TIMRS/ITIR      return	end**=================== MDIFF ============================================*                                                                      	subroutine MDIFF(fildif)	include 'tranal.h'	character*64 fildif	open(unit=9,file=fildif,status='unknown')	write(*,*)     +'translational time -correlation function of type',IDF	write(9,'(a)')' D units is 10**-9 m**2/s '	write(9,'(a,I3)')     +'#  translational time -correlation function of type',IDF	write(9,*)'  t(ps)  Dav    Ddif       R(A)  Dx     Dy     Dz'	write(*,*)NTT 	TSHO=0.	do I=1,NTT	  TIM=I*DTT*1.d12	  if(NCUM(I).gt.0)then	    TCOR=10.*RCUM(I)/(6.d0*TIM*NCUM(I))	    TCX=10.*RCUMX(I)/(2.d0*TIM*NCUM(I))	    TCY=10.*RCUMY(I)/(2.d0*TIM*NCUM(I))	    TCZ=10.*RCUMZ(I)/(2.d0*TIM*NCUM(I))	    TSH2=RCUM(I)/NCUM(I)	    TSH=sqrt(TSH2)	    TSD=1.d-11*TSH*(TSH-TSHO)/(3.*DTT) 	    TSHO=TSH            write(9,'(f10.3,2f10.5,f10.3,3f10.5,i9)')     +TIM,TCOR,TSD,TSH,TCX,TCY,TCZ,NCUM(I)      write(*,'(f10.3,2f10.5,f10.3,3f10.5,i9)')     +TIM,TCOR,TSD,TSH,TCX,TCY,TCZ,NCUM(I)	  end if	end do	return	end                                               **=================== TAKETOR ============================================*                                                                        	subroutine TAKETOR	include "tranal.h"*  Torsion angle distributions	do ITYP=1,NAG     !  type of torsion	  do N=IADT(ITYP)+1,IADT(ITYP+1)        I         = IT(N)          J         = JT(N)        K         = KT(N)        L         = LT(N)	  MTYP = ITS(I)                 !  type of molecule	  do IMOL=1,NSPEC(MTYP)         !  over molecules of this type	    IST = ISADDR(MTYP)+(IMOL-1)*NSITS(MTYP)-ISADR(MTYP)+I	    JST = ISADDR(MTYP)+(IMOL-1)*NSITS(MTYP)-ISADR(MTYP)+J	    KST = ISADDR(MTYP)+(IMOL-1)*NSITS(MTYP)-ISADR(MTYP)+K	    LST = ISADDR(MTYP)+(IMOL-1)*NSITS(MTYP)-ISADR(MTYP)+L        ax        = sx(jst)-sx(ist)        ay        = sy(jst)-sy(ist)        az        = sz(jst)-sz(ist)        bx        = sx(kst)-sx(jst)        by        = sy(kst)-sy(jst)        bz        = sz(kst)-sz(jst)        cx        = sx(lst)-sx(kst)        cy        = sy(lst)-sy(kst)        cz        = sz(lst)-sz(kst)*        call PBC(AX,AY,AZ)        call PBC(BX,BY,BZ)        call PBC(CX,CY,CZ)*        ab        = ax*bx + ay*by + az*bz        bc        = bx*cx + by*cy + bz*cz        ac        = ax*cx + ay*cy + az*cz        at        = ax*ax + ay*ay + az*az        bt        = bx*bx + by*by + bz*bz        ct        = cx*cx + cy*cy + cz*cz        axb       = (at*bt)-(ab*ab)        bxc       = (bt*ct)-(bc*bc)*        fnum      = (ab*bc)-(ac*bt)        den       = axb*bxc        if(den.gt.0.0d0) then *          den       = dsqrt(den)         Cosine of angle:          co        = fnum/den          CO        = DMIN1(CO, 1.D0)          CO        = DMAX1(CO,-1.D0)* Sign of angle:      signum    = ax*(by*cz-cy*bz)+ay*(bz*cx-cz*bx)+az*(bx*cy-cx*by)* Value of angle:          arg       = dsign(dacos(co),signum)	  else	    arg=0.d0	  end if    	  NARG=0.5*(arg+PI)*NAA/PI+1	  if(abs(arg*180/PI).le.120)then	    IGS(ITYP)=IGS(ITYP)+1	  else	    ITRAN(ITYP)=ITRAN(ITYP)+1	  end if	  NPOP(ITYP,NARG)=NPOP(ITYP,NARG)+1 	  if(IPRINT.ge.8)write(*,'(6i5,f10.3)')     +ITYP,IMOL,IST,JST,KST,LST,ARG*180/PI	  end do	  end do	end do	end**=================== MAKEPS ============================================*                                                                       	subroutine MAKEPS(filps,IX1,IX2,IY)	include 'tranal.h'           character*2 color(0:maxcolor)	character*12 filps	character*80 com 	data color/     *   '0C', !  'bC', ! esli zadat' maxcolor==20,     *   '1C', !  'cC', ! to nado ubrat' vosklicatel'nye     *   '2C', !  'dC', ! znaki mezhdu dannymi     *   '3C', !  'eC',     *   '4C', !  'fC',     *   '5C', !  'gC',     *   '6C', !  'hC',     *   '7C', !  'iC',     *   '8C', !  'jC',     *   '9C', !  'kC',     *   'aC' /                        	write(*,*)' Enter MAKEPS' 	ICHAN=20      open( ICHAN, file='tmp.ps', status='unknown' )      write(20,*)IY,IX1,'(',NM(IS1(1)),') l-show'      write(20,*)IY,IX2,'(',NM(IS2(1)),') l-show'      do j=0,NTY        m = -NTX        IC = ITAB(j,1)        do i=-NTX+1,NTX          n = ITAB(j,i)c n - eto uzhe No. tsveta ot 0 do maxcolor          if( n .ne. IC ) then              write( 20, 100 )   j,    m, i-1, color(ic)            IC = n            m = i          endif        enddo        write( 20, 100 )   j,    m, NTY, color(ic)        write( 20, * )      enddoC      write(20,'(a)')'0 se

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -