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

📄 forcee.f

📁 分子动力学模拟程序
💻 F
📖 第 1 页 / 共 4 页
字号:
        FY(N)        = 0.D0        FZ(N)        = 0.D0        OX(N)        = 0.D0        OY(N)        = 0.D0        OZ(N)        = 0.D0      END DO! OF N *      IF(NTYPES.EQ.1.AND.NSPEC(1).EQ.1) RETURN*** Sum over atom pairs      DO INP      = 1,MBLN 10	ISP0=NBL1(INP)	JSP=NBL2(INP)        ISP=iabs(ISP0)	ITYP=ITYPE(ISP)	JTYP=ITYPE(JSP)	ISB =NSITE(ISP)  	JSB =NSITE(JSP)        IMOL=NNUM(ISP)        JMOL=NNUM(JSP)	MTR=MDX(ITYP,JTYP)	if(ISP0.le.0)then  * signals that this pair is 1-4 neigbours	  if(ITYP.ne.JTYP)write(*,*)     +'!!! different mol. types for 1-4 interaction:',     +ITYP,JTYP,ISP,JSP,' FF'	  FCTLJ=C14LJ(ITYP)*   8.2.1 special 1-4 interactionsc   Look through the list of special 1-4 interactionsC   and check whether this pair belong to itC   This procedure may seem cumbersobe, but I didnot find better wayC   without using (NSITES,NSITES) array. Really this is not veryC   time-consuming; saving memory is preferable	  do I=1,NNAD 	    ILA=ILJ(I)	    if(ILA.eq.ISB)then  	      do J=1,NNAD 	        JLA=ILJ(J)	        if(JLA.eq.JSB)then                  EPSI       =  EPAD(I)*EPAD(J)                  SIGM       =  SIGAD(I)+SIGAD(J)                  go to 195	        end if	      end do              EPSI       =  EPAD(I)*EPSIL(JSB)              SIGM       =  SIGAD(I)+SIGMA(JSB)              go to 195	    end if	  end do	  do J=1,NNAD	    JLA=ILJ(J)	    if(JLA.eq.JSB)then              EPSI       =  EPSIL(ISB)*EPAD(J)              SIGM       =  SIGMA(ISB)+SIGAD(J)              go to 195	    end if	  end do*   8.2.2  Normal LJ for 1-4 connected pairsCC   Note: EPSIL here, above and below is really sqrt(epsil) in LJ potentialC  (see also setup.f )C          EPSI       =  EPSIL(ISB)*EPSIL(JSB)          SIGM       =  SIGMA(ISB)+SIGMA(JSB) 195      continue           A6         = -EPSI*SIGM**6*FCTLJ              B12       =  EPSI*SIGM**12*FCTLJ      	  QIJ=CHARGE(ISB)*CHARGE(JSB)*COULF*C14EL(ITYP)*   8.2.3 Not 1-4 neigbours	else  ! if(ISP0*  the same molecule - not scale in EE          if(IMOL.eq.JMOL)then            EPSI       =  EPS(ISB,JSB)            SIGM       =  SIG(ISB,JSB)            A6         = -EPSI*SIGM**6            B12        =  EPSI*SIGM**12            QIJ        =  CHARGE(ISB)*CHARGE(JSB)*COULF*  scaled parameters defined in RECINT          else  	    A6=SIX(ISB,JSB)	    B12=TWL(ISB,JSB)	    QIJ=ONE(ISB,JSB)          end if        end if   ! if(ISPO...        DX           = SX(ISP)-SX(JSP)        DY           = SY(ISP)-SY(JSP)        DZ           = SZ(ISP)-SZ(JSP)*                  call PBC(DX,DY,DZ)        if(DX.gt. HBOXL)DX=DX-BOXL        if(DX.lt.-HBOXL)DX=DX+BOXL        if(DY.gt. HBOYL)DY=DY-BOYL        if(DY.lt.-HBOYL)DY=DY+BOYL        if(DZ.gt. HBOZL)DZ=DZ-BOZL        if(DZ.lt.-HBOZL)DZ=DZ+BOZL*  	RR           = DX**2+DY**2+DZ**2        R1           = DSQRT(RR)C        if(R1.le.3..and.(ISP.eq.12.or.JSP.eq.12))C     +write(*,*)'F- long ',R1,' atoms ',ISP,JSP        R2I          = 1.0D0/RR	R1I	   = R1*R2I*  Electrostatic interaction        ALPHAR       = ALPHAD*R1	TTT          = 1.D0/(1.D0+B1*ALPHAR)        EXP2A        = DEXP(-ALPHAR**2)        ERFC = ((((A5*TTT+A4)*TTT+A3)*TTT+A2)*TTT+A1)*TTT*EXP2A 	EE1	= QIJ*R1I*  LJ interaction        R6I          = R2I*R2I*R2I        ESR          = (     A6+      B12*R6I)*R6I        FSR          = (6.D0*A6+12.D0*B12*R6I)*R6I*R2I	if(IMOL.eq.JMOL)then C   This can not happen for different molecules... C   Scaling constant from the input           if(ISP0.le.0)then	    EES=EE1            FES=EES*R2I          else            FES          = QIJ*(TOTPI*ALPHAR*EXP2A+ERFC)*R1I*R2I            EES          = EE1*ERFC          end if        else   ! normal case          FES          = QIJ*(TOTPI*ALPHAR*EXP2A+ERFC)*R1I*R2I          EES          = EE1*ERFC	end if        FORCE        = FES+FSR*  Forces          FX(ISP)      = FX(ISP)+FORCE*DX          FY(ISP)      = FY(ISP)+FORCE*DY          FZ(ISP)      = FZ(ISP)+FORCE*DZ          FX(JSP)      = FX(JSP)-FORCE*DX          FY(JSP)      = FY(JSP)-FORCE*DY          FZ(JSP)      = FZ(JSP)-FORCE*DZ          VIR1	 = VIR1+FSR*RR	  if(IMOL.ne.JMOL.or.LMOVE(ITYP))then	    VIRX	= VIRX+FORCE*DX**2  	    VIRY	= VIRY+FORCE*DY**2  	    VIRZ	= VIRZ+FORCE*DZ**2  	  end if	  POTES(MTR)   = POTES(MTR)+EE1	  POTLJ(MTR)   = POTLJ(MTR)+ESR	  PELS1=PELS1+EES          PE1 = PE1+ESR*      END DO! OF INP					**     print *,'potes(1)',potes(1)*enerf*1.d-3/256.*     print *,'potlj(1)',potlj(1)*enerf*1.d-3/256.*     print *,'potes(2)',potes(2)*enerf*1.d-3/256.*     print *,'potlj(2)',potlj(2)*enerf*1.d-3/256.*     print *,'potes(3)',potes(3)*enerf*1.d-3/256.*     print *,'potlj(3)',potlj(3)*enerf*1.d-3/256.**Accumulate total forces*      DO N         = 1,NSTOT	M	= NNUM(N)        GX(N)        = GX(N)+FX(N)        GY(N)        = GY(N)+FY(N)        GZ(N)        = GZ(N)+FZ(N)	WIRS	= WIRS-GX(N)*(SX(N)-X(M))-GY(N)*(SY(N)-Y(M))-     +               GZ(N)*(SZ(N)-Z(M))      END DO! OF N      timel	= timel+cputime(timel0)*      RETURN      END**======================= LOCALF ==========================================*      SUBROUTINE LOCALF**  LJ and electrostatic interactions of closest neigbours*      include "mdee.h"*      times0	= cputime(0.d0)      DO N         = 1,NSTOT        FX(N)        = 0.D0        FY(N)        = 0.D0        FZ(N)        = 0.D0      END DO! OF N*      IF(NTYPES.EQ.1.AND.NSPEC(1).EQ.1) RETURN** Sum over atom pairs      EEE=0.      ELJ=0.      DO INP      = 1,MBSH	ISP0=NBS1(INP)	JSP=NBS2(INP)        ISP=iabs(ISP0)	ITYP=ITYPE(ISP)	JTYP=ITYPE(JSP)	ISB =NSITE(ISP)  	JSB =NSITE(JSP)        IMOL=NNUM(ISP)        JMOL=NNUM(JSP)	MTR=MDX(ITYP,JTYP)	if(ISP0.le.0)then  * signals that this pair is 1-4 neigbours	  if(ITYP.ne.JTYP)write(*,*)     +'!!! different mol. types for 1-4 interaction:',     +ITYP,JTYP,ISP,JSP,' FF'	  FCTLJ=C14LJ(ITYP)*   9.2.1 special 1-4 interactionsc   Look through the list of special 1-4 interactionsC   and check whether this pair belong to itC   This procedure may seem cumbersobe, but I didnot find better wayC   without using (NSITES,NSITES) array. Really this is not veryC   time-consuming; saving memory is preferable	  do I=1,NNAD 	    ILA=ILJ(I)	    if(ILA.eq.ISB)then  	      do J=1,NNAD 	        JLA=ILJ(J)	        if(JLA.eq.JSB)then                  EPSI       =  EPAD(I)*EPAD(J)                  SIGM       =  SIGAD(I)+SIGAD(J)                  go to 195	        end if	      end do              EPSI       =  EPAD(I)*EPSIL(JSB)              SIGM       =  SIGAD(I)+SIGMA(JSB)              go to 195	    end if	  end do	  do J=1,NNAD	    JLA=ILJ(J)	    if(JLA.eq.JSB)then              EPSI       =  EPSIL(ISB)*EPAD(J)              SIGM       =  SIGMA(ISB)+SIGAD(J)              go to 195	    end if	  end do*   8.2.2  Normal LJ for 1-4 connected pairsCC   Note: EPSIL here, above and below is really sqrt(epsil) in LJ potentialC  (see also setup.f )C          EPSI       =  EPSIL(ISB)*EPSIL(JSB)          SIGM       =  SIGMA(ISB)+SIGMA(JSB) 195      continue           A6         = -EPSI*SIGM**6*FCTLJ              B12       =  EPSI*SIGM**12*FCTLJ      	  QIJ=CHARGE(ISB)*CHARGE(JSB)*COULF*C14EL(ITYP)*   9.2.3 Not 1-4 neigbours	else  ! if(ISP0*  the same molecule - not scale in EE          if(IMOL.eq.JMOL)then            EPSI       =  EPS(ISB,JSB)            SIGM       =  SIG(ISB,JSB)            A6         = -EPSI*SIGM**6            B12        =  EPSI*SIGM**12            QIJ        =  CHARGE(ISB)*CHARGE(JSB)*COULF*  scaled parameters defined in RECINT          else  	    A6=SIX(ISB,JSB)	    B12=TWL(ISB,JSB)	    QIJ=ONE(ISB,JSB)          end if        end if   ! if(ISPO...**   9.2 Calculate interaction parameters for the given atom pair *   ------------------------------------------------------------        DX           = SX(ISP)-SX(JSP)        DY           = SY(ISP)-SY(JSP)        DZ           = SZ(ISP)-SZ(JSP)*                  call PBC(DX,DY,DZ)        if(DX.gt. HBOXL)DX=DX-BOXL        if(DX.lt.-HBOXL)DX=DX+BOXL        if(DY.gt. HBOYL)DY=DY-BOYL        if(DY.lt.-HBOYL)DY=DY+BOYL        if(DZ.gt. HBOZL)DZ=DZ-BOZL        if(DZ.lt.-HBOZL)DZ=DZ+BOZL*  	RR           = DX**2+DY**2+DZ**2        R1           = DSQRT(RR)C        if(R1.le.3..and.(ISP.eq.12.or.JSP.eq.12))C     +write(*,*)'F- short ',R1,' atoms ',ISP,JSP          R2I          = 1.0D0/RR	  R1I	   = R1*R2I*  Electrostatic interaction          ALPHAR       = ALPHAD*R1	  TTT          = 1.D0/(1.D0+B1*ALPHAR)          EXP2A        = DEXP(-ALPHAR**2)          ERFC = ((((A5*TTT+A4)*TTT+A3)*TTT+A2)*TTT+A1)*TTT*EXP2A 	  EE1	= QIJ*R1I	  if(ISP0.le.0)then C   This can not happen for different molecules...             EES=EE1            FORCE=EES*R2I          else            FORCE        = QIJ*(TOTPI*ALPHAR*EXP2A+ERFC)*R1I*R2I            EES          = EE1*ERFC	  end if	  POTES(MTR)    = POTES(MTR)+EE1	  PELS2=PELS2+EES*  LJ interaction	  if(A6.ne.0.d0.or.B12.ne.0.d0)then            R6I          = R2I*R2I*R2I            ESR          = (     A6+      B12*R6I)*R6I            FSR          = (6.D0*A6+12.D0*B12*R6I)*R6I*R2I	      FORCE        = FORCE+FSR              VIR2		= VIR2+FSR*RR	      POTLJ(MTR)    = POTLJ(MTR)+ESR	      PE2		= PE2+ESR	     end if     *        write(*,'(4i5,5e11.4)')ISP0,JSP,ISB,JSB,R1,ESR,EES,PE*  Forces        FX(ISP)      = FX(ISP)+FORCE*DX        FY(ISP)      = FY(ISP)+FORCE*DY        FZ(ISP)      = FZ(ISP)+FORCE*DZ        FX(JSP)      = FX(JSP)-FORCE*DX        FY(JSP)      = FY(JSP)-FORCE*DY        FZ(JSP)      = FZ(JSP)-FORCE*DZ	VIRFX	= VIRFX+FORCE*DX**2  	VIRFY	= VIRFY+FORCE*DY**2  	VIRFZ	= VIRFZ+FORCE*DZ**2  *      END DO! OF INP      PERMOL=0.001*ENERF / NOP**Accumulate total forces*      DO N         = 1,NSTOT	M	= NNUM(N)        HX(N)        = HX(N)+FX(N)        HY(N)        = HY(N)+FY(N)        HZ(N)        = HZ(N)+FZ(N)        WIRSS	= WIRSS-HX(N)*(SX(N)-X(M))-HY(N)*(SY(N)-Y(M))-     +               HZ(N)*(SZ(N)-Z(M))      END DO! OF N      VIRS=VIRS+VIR1      VIRLS=VIRLS+VIR1      times	= times+cputime(times0)*      RETURN      END **=============== FURIR =======================================*      SUBROUTINE FURIR*      include "mdee.h"      real*8 TSIN(NTOT),TCOS(NTOT)*                                       	timef0	= cputime(0.d0)*      call INIFUR*      IF(NTYPES.EQ.1.AND.NSPEC(1).EQ.1) RETURN	if(NKV.eq.0)return*      QSS         = 0.D0      DO ITYP     = 1,NTYPES        QSS         = QSS+QSUM(ITYP)      END DO! OF ITYP      IF(QSS.EQ.0.D0) RETURN*      QPE         = 0.D0      CFUR=4.d0*PI*COULF/VOL     *      DO I        = 1,NSTOT	  FX(I)=0.d0	  FY(I)=0.d0	  FZ(I)=0.d0      END DO! OF I*   reciprocal space Evald      do IKV=1,NKV        RXV=RX(IKV)        RYV=RY(IKV)        RZV=RZ(IKV)        SCS=0.        SSN=0.C$DIR NO_RECURRENCE        do I=1,NSTOT          SCP=RXV*SX(I)+RYV*SY(I)+RZV*SZ(I)          ITYP=ITYPE(I)          IC=NSITE(I)	  if(IEE(ITYP).eq.0)then	      QO=CHARGE(IC)*EC(ME)	  else	      QO=CHARGE(IC)	  end if*  sin and cos from tables          SINSC=QO*sin(SCP)          COSSC=QO*cos(SCP)          TSIN(I)=SINSC          TCOS(I)=COSSC          SSN=SSN+SINSC          SCS=SCS+COSSC        end do        AKC=CFUR*AK(IKV)        QPE=QPE+AKC*(SSN**2+SCS**2)        AK2=2.d0*AKC        do I=1,NSTOT          QFOR=AK2*(SCS*TSIN(I)-SSN*TCOS(I))          FX(I)=FX(I)+RXV*QFOR          FY(I)=FY(I)+RYV*QFOR          FZ(I)=FZ(I)+RZV*QFOR        end do	VIRX=VIRX-RXV**2*AKV*(SSN**2+SCS**2) 	VIRY=VIRY-RYV**2*AKV*(SSN**2+SCS**2)	VIRZ=VIRZ-RZV**2*AKV*(SSN**2+SCS**2)      end do            DO I     = 1,NSTOT        GX(I)    = GX(I)+FX(I)        GY(I)    = GY(I)+FY(I)        GZ(I)    = GZ(I)+FZ(I)        IMOL	= NNUM(I)        WIR1	= WIR1-FX(I)*(SX(I)-X(IMOL))-FY(I)*(SY(I)-Y(IMOL))-     +               FZ(I)*(SZ(I)-Z(IMOL))      END DO! OF I*      VIRX=VIRX+QPE      VIRY=VIRY+QPE      VIRZ=VIRZ+QPE      PELS1=PELS1+QPE      FACTR=  0.001*ENERF/FNOP*	if(IPRINT.ge.7)write(*,'(a,4f12.5)')*     +' FUR_TRUE:',FACTR*QPE      timef	= timef+cputime(timef0)      return      end**================= INIFUR =========================================*      subroutine INIFUR	include "mdee.h"      data INIT/0/      save INIT      if(INIT.ne.0)return         INIT=1	if(ALPHAD.eq.0.d0)then	  NKV=0	  return      end if          ALP2=ALPHAD**2      CUTK2=4.d0*ALP2*FEXP	CUTK=sqrt(CUTK2)      FKX=2.d0*PI/BOXL      FKY=2.d0*PI/BOYL      FKZ=2.d0*PI/BOZL      IKV=0	KMAX=CUTK/FKX+1	KMAY=CUTK/FKY+1	KMAZ=CUTK/FKZ+1      do IKZ=-KMAZ,KMAZ        do IKX=0,KMAX          if(IKX.eq.0)then            if(IKZ.gt.0)then              KY1=0            else              KY1=1            end if            KY2=KMAY          else            KY1=-KMAY            KY2=KMAY          end if          do IKY=KY1,KY2            RK2=(IKX*FKX)**2+(IKY*FKY)**2+(IKZ*FKZ)**2            if(RK2.le.CUTK2)then      	      IKV=IKV+1              if(IKV.gt.NKVMAX)stop 'increase NKVMAX'              RX(IKV)=IKX*FKX              RY(IKV)=IKY*FKY              RZ(IKV)=IKZ*FKZ              AK(IKV)=exp(-0.25d0*RK2/ALP2)/RK2            end if

⌨️ 快捷键说明

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