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

📄 mdstepe.f

📁 分子动力学模拟程序
💻 F
📖 第 1 页 / 共 2 页
字号:
*=============== SULTAN ================================================*      SUBROUTINE SULTAN**  Constrained MD*      include "mdee.h"*      LOGICAL LRDF      DATA LRDF/.false./**>----------------------------      CALL GETCOM     ! supl.f            call CHCNB(LRDF)       ! mdstep.f      DO ITYP = 1,NTYPES      CALL GETBND(ITYP)   ! i-forces.f      CALL GETANG(ITYP)   ! i-forces.f      CALL GETTRS(ITYP)   ! i-forces.f      END DO!  OF ITYP       call LOCALF         ! l-forces.f  > not needed because RSHORT=0*      CALL ZEROFS(2)  ! supl.f      CALL FURIR      ! l-forces.f      CALL ETERMS     ! l-forces.f      CALL FORCES     ! l-forces.f      if(LNPT)call ELRCLJ     ! l-forces.f      LRDF=.true.      NSTEP=0 1    NSTEP=NSTEP+1      MSTEP=NSTTOT+NSTEP*>----------------------------*  remember old positions*      DO I         = 1,NSTOT        OX(I)        = SX(I)        OY(I)        = SY(I)        OZ(I)        = SZ(I)        FX(I) = GX(I)+HX(I)        FY(I) = GY(I)+HY(I)        FZ(I) = GZ(I)+HZ(I)*Unconstrained velocities at step n+1/2        VX(I)        = VX(I)+TSTEP*FX(I)        VY(I)        = VY(I)+TSTEP*FY(I)        VZ(I)        = VZ(I)+TSTEP*FZ(I)*Unconstrained  postions  at step n+1        SX(I)        = SX(I)+TSTEP*VX(I)*MASSDI(I)        SY(I)        = SY(I)+TSTEP*VY(I)*MASSDI(I)        SZ(I)        = SZ(I)+TSTEP*VZ(I)*MASSDI(I)      END DO! OF L**  Constrain dynamics                                 VIRA(1)=0.      VIRA(2)=0.      VIRA(3)=0.      do IMOL=1,NOP	CALL SHEJK(IMOL)      end do*  first time - correct velocities      if(MSTEP.eq.1)then        call GETEMP        FTMP        = SQRT(TRTEMP/TEMP)        DO     N    = 1,NSTOT          VX(N)       = VX(N)*FTMP          VY(N)       = VY(N)*FTMP          VZ(N)       = VZ(N)*FTMP        end do      end if*  Realization of specified ensemble      CALL SCALING(3)      call GETCOM      if(mod(MSTEP,ICHNB).eq.0)call CHCNB(LRDF)        CALL ZEROFS(1)	call ZEROAV	LCSRDF=.true.*       *      DO ITYP = 1,NTYPES      CALL GETBND(ITYP)   ! i-forces.f      CALL GETANG(ITYP)   ! i-forces.f      CALL GETTRS(ITYP)   ! i-forces.f      END DO!  OF ITYP       call LOCALF         ! l-forces.f*      CALL ZEROFS(2)  ! supl.f      CALL FURIR      ! l-forces.f      CALL ETERMS     ! l-forces.f      CALL FORCES     ! l-forces.f  - must be the last for comp. WIRS      if(LNPT)call ELRCLJ     ! l-forces.f*      timeg0	= cputime(0.d0)      CALL SCLFRC(DONE,3)**  Change of ensemble      if(mod(MSTEP,NCEE).eq.0)call CHENS*  Collecting averages      CALL GETKIN     ! supl.f*      CALL GETROT     ! supl.f*      CALL DIPOLE      if(mod(MSTEP,IAVER).eq.0)CALL GETAVR(1)*      NSTEPA=NSTEPA+1      PEST=PELS1+PELS2+SPE      PE = PE1+PE2+PESTC   Total intermolecular energy        PENL=PE*PERMOLC   Electrostatic potential energy              PEL=PEST*PERMOLC   Intramolecular potential energy              PENS=PINT*PERMOL        PEKI=TKE*0.001*ENERF                 !   kinetic energy        ETOT=PENL+PENS+PEKI                  !   total energy        POTEN	= PENL+PENS                   !  total potential energy        PHD=POTLJ(MOLINT)*1.d-3*ENERF/NHDM      !  energy of hydrogen bonds        WIRSUM=WIRS+WIRSSC   These are diffrent contribution to pressure:	        TRYCKE	= PEST*UNITP/(3.*VOL)    ! electrostatic contr.        TRYCKL	= (VIR1+VIR2)*UNITP/(3.*VOL)     ! LJ        TRYCKB	= VIRB*UNITP/(3.*VOL)    ! bond (flexible)        TRYCKA	= (VIRA(1)+VIRA(2)+VIRA(3))*UNITP/(3.*VOL) ! shejk-correction         TRYCKS	= WIRSUM*UNITP/(3.*VOL) ! orientational correction        TRYCKD	= VIRD*UNITP/(3.*VOL) ! long-range correction        DENS	= TOTMAS*1.d-3/(VOL*UNITL**3) !  current density*      if(IPRINT.ge.5.and.mod(MSTEP,IAVER).eq.0)     +WRITE(6,991) MSTEP,ME,POTEN,PENS,PEL,ETOT,TEMP,TRYCKM,DENS*  990 FORMAT('%',A1,I5,2(1X,F10.3),1X,F9.2,1X,F9.3,1X,F10.3,1X,F8.4)          if(IPRINT.ge.6)write(*,'(2f9.6,5f10.2)')     +   SC,SCL,TRYCK,TTR,TROT,TINT,TEMPV	  if(IPRINT.ge.6.and.LSEP)write(*,'(4f11.1,3f11.3)')     + TRYCKX,TRYCKY,TRYCKZ,(TRYCKX+TRYCKY+TRYCKZ)/3.,BOXL,BOYL,BOZL          if(IPRINT.ge.6.and.IEXT.eq.1)write(*,'(2(a,e14.6))')     +    ' E abs: ',(EABSS+EABS)*PERMOL 	  if(IPRINT.ge.7)     +  WRITE(6,'(8f10.2)')TRYCKL,TRYCKE,TRYCKB,TRYCKA,TRYCKS,TRYCKD  991 FORMAT(I7,I4,4F9.3,2(1X,f9.2),f9.4)**      IF(mod(MSTEP,NAVER).eq.0)call GETAVR(2)      if(LDMP.and.mod(NSTTOT+NSTEP,NDUMP).eq.0)call RESTRT(2)      timeg	= timeg+cputime(timeg0)**<---------------------      if(NSTEP.lt.NSTEPS)go to 1*<---------------------*      RETURN      END**=============== DOUBLE ================================================*      SUBROUTINE DOUBLE*      include "mdee.h"*      LOGICAL LRDF      DATA LRDF/.false./**>----------------------------*    Restore forces, COM and list of neigbours*      LRDF=.false.      NFREQ2=NFREQ/2+1      VIRA(1)=0.      VIRA(2)=0.      VIRA(3)=0.      CALL ZEROFS(1)      CALL GETCOM     ! supl.f       call CHCNB(LRDF)      ! mdstep.f      LRDF=.true.      NFR2	= NFREQ/2+1**             LCSRDF=.false.      DO ITYP = 1,NTYPES        CALL GETBND(ITYP)   ! i-forces.f        CALL GETANG(ITYP)   ! i-forces.f        CALL GETTRS(ITYP)   ! i-forces.f      END DO!  OF ITYP      call LOCALF         ! l-forces.f      CALL SCLFRC(DONE,1)**      CALL ZEROFS(2)  ! supl.f       CALL FURIR      ! l-forces.f      CALL ETERMS     ! l-forces.f      CALL FORCES     ! l-forces.f      call ELRCLJ     ! l-forces.f      CALL SCLFRC(DONE,2)*      if(IPRINT.ge.7)then	PELL=PELS1+PELS2+SPE        PENL=(PE1+PE2+PELL)*PERMOL        PEL=PELL*PERMOL        PENS=PINT*PERMOL        PEKI=TKE*PERMOL        ETOT=PENL+PENS+PEKI        WRITE(6,'(4(a6,f12.5))')     +' Eex= ',PENL,' Ein= ',PENS,' Eel= ',PEL,' Etot=',ETOT       end if**   Begin MD*      NSTEP=0 1    NSTEP=NSTEP+1	MSTEP=NSTTOT+NSTEP*>----------------------------      call SCALING(1)                 *  velocity correction due to slow forces      DO I           =  1,NSTOT        VX(I)          =   VX(I)+TSTEP*GX(I)*0.5D0        VY(I)          =   VY(I)+TSTEP*GY(I)*0.5D0        VZ(I)          =   VZ(I)+TSTEP*GZ(I)*0.5D0      END DO! OF I**- - - - - - - FAST MOTION - - - - - - - -*           LCSRDF=.false.      call ZEROAV      DO NSTEB       =  1,NFREQ 	if(NSTEB.eq.NFREQ)LCSRDF=.true.        DO I           =  1,NSTOT          VX(I) =   VX(I)+TSTEB*HX(I)*0.5D0         ! V(t+1/2)          VY(I) =   VY(I)+TSTEB*HY(I)*0.5D0          VZ(I) =   VZ(I)+TSTEB*HZ(I)*0.5D0          SX(I) =   VX(I)*TSTEB*MASSDI(I)+SX(I)     ! X(t+1)          SY(I) =   VY(I)*TSTEB*MASSDI(I)+SY(I)          SZ(I) =   VZ(I)*TSTEB*MASSDI(I)+SZ(I)        END DO! OF I*  Realization of the specified ensemble	CALL GETCOM 	if(NSTEB.eq.NFR2.and.mod(MSTEP,ICHNB).eq.0)then           call CHCNB(LRDF)        end if*  Recalculation of slow forces	if(mod(NSTEB,NFREQ).eq.0)then          CALL ZEROFS(2)      ! supl.f          CALL FURIR          ! l-forces.f          CALL ETERMS         ! l-forces.f          CALL FORCES         ! l-forces.f*          if(LNPT)call ELRCLJ         ! l-forces.f          CALL SCLFRC(DONE,2)   ! supl.f        end if        CALL ZEROFS(1)      ! supl.f	DO ITYP = 1,NTYPES          CALL GETBND(ITYP)     ! i-forces.f           F(t+1)          CALL GETANG(ITYP)     ! i-forces.f          CALL GETTRS(ITYP)     ! i-forces.f        END DO!  OF ITYP	call LOCALF            ! l-forces.f*        CALL SCLFRC(DONE,1)    ! supl.f*                   DO I           =  1,NSTOT            VX(I)          =  VX(I)+TSTEB*HX(I)*0.5D0     !  V(t+1)            VY(I)          =  VY(I)+TSTEB*HY(I)*0.5D0            VZ(I)          =  VZ(I)+TSTEB*HZ(I)*0.5D0          END DO! OF I        **  Realization of the specified ensemble*  Change of subensemble	if(NSTEB.eq.NFR2.and.mod(MSTEP,NCEE).eq.0)call CHENS*        if(IPRINT.ge.8)then          CALL GETEMP     ! aver.f  990 FORMAT('%',A1,I5,2(1X,F10.3),1X,F9.2,1X,F10.3,1X,F9.2,1X,F9.2)          WRITE(6,990) WHICH,NSTEB,POTEN,ETOT,TEMP,VIR,TRL,TRYCK        end if      END DO! OF NSTEB**- - - - - - - SLOW MOTION - - - - - - - -*           timeg0	= cputime(0.d0)*      DO I           = 1,NSTOT        VX(I)          =  VX(I)+TSTEP*GX(I)*0.5D0        VY(I)          =  VY(I)+TSTEP*GY(I)*0.5D0        VZ(I)          =  VZ(I)+TSTEP*GZ(I)*0.5D0      END DO! OF I      CALL SCALING(2)       ! mdstep.f**  Collecting averages      NSTEPA=NSTEPA+1      CALL GETKIN       ! supl.f*      CALL GETROT       ! supl.f*      CALL DIPOLE       ! supl.f      if(mod(MSTEP,IAVER).eq.0)CALL GETAVR(1)        PEST = PELS1+PELS2+SPE        PE = PE1+PE2+PEST        PENL = PE*PERMOL                ! intermolecular energy        PEL= PEST*PERMOL                ! electrostatic energy                  PENS=PINT*PERMOL                ! intramolecular energy        PEKI=TKE*0.001*ENERF            ! kinetic energy        POTEN=PENL+PENS                 ! total potential energy        ETOT =POTEN+PEKI                ! total energy           WIRSUM=WIRS+WIRSS        TRYCKE	= PEL*UNITP/(3.*VOL*PERMOL)     ! electrostatic        TRYCKL	= (VIR1+VIR2)*UNITP/(3.*VOL)    ! LJ        TRYCKB	= VIRB*UNITP/(3.*VOL)           ! bonds        TRYCKS	= WIRSUM*UNITP/(3.*VOL)         ! molecular        TRYCKA	= (VIRA(1)+VIRA(2)+VIRA(3))*UNITP/(3.*VOL) ! molecular        TRYCKD	= VIRD*UNITP/(3.*VOL)           ! long-range corr.        DENS	= TOTMAS*1.d-3/(VOL*UNITL**3)**      if(IPRINT.ge.6)WRITE(6,'(4(a6,f12.5))')*     +' Eex= ',PENL,' Ein= ',PENS,' Eki= ',PEKI,' Etot=',ETOT       if(IPRINT.ge.5.and.mod(MSTEP,IAVER).eq.0)     +WRITE(6,991) MSTEP,ME,POTEN,PENS,PEL,ETOT,TEMP,TRYCK,DENS          if(IPRINT.ge.6)write(*,'(2f7.4,f9.2,4f7.1,I7,I9)')     + SC,SCL,TRYCKM,TTR,TROT,TINT,TEMPV,MBSH,MBLN      	  if(IPRINT.ge.6.and.LSEP)write(*,'(4f11.1,3f11.3)')     + TRYCKX,TRYCKY,TRYCKZ,(TRYCKX+TRYCKY+TRYCKZ)/3.,BOXL,BOYL,BOZL          if(IPRINT.ge.6.and.IEXT.eq.1)write(*,'(2(a,e14.6))')     +    ' E abs: ',(EABS+EABSS)*PERMOL,' Ext.f. ',EFIELD 	  if(IPRINT.ge.7)     +  WRITE(6,'(8f10.1)')TRYCKL,TRYCKE,TRYCKB,TRYCKS,TRYCKD,TRID  991 FORMAT(I7,I4,4F9.3,2(1X,f9.2),f9.4)*      if(mod(MSTEP,NAVER).eq.0)CALL GETAVR(2)      if(LDMP.and.mod(MSTEP,NDUMP).eq.0)call RESTRT(2)      timeg	= timeg+cputime(timeg0)**<---------------------      if(NSTEP.lt.NSTEPS)go to 1*<---------------------*      RETURN      END**=============== SCALING ==============================================*      SUBROUTINE SCALING(IAL)**  3  Realisation of the specified ensemble*  ----------------------------------------C  Case NVT/NPT - Nose-Hoover thermostat, "modular-invariant" version C  of G.J.Martyna, D.J.Tobais and M.L.Klein,C  J.Chem.Ohys., v.101(5), p.4177 (1994)C  C  NVE - if specified, do simple velocity scaling if temperature C        deviate from reference value more that TDELT CC  IAL = 1 - first half-step in double time step algorithmC  IAL = 2 - second half-step in double time step algorithmC  IAL = 3 - Leap-frog algorithmC**  3.1 Definitions*  ---------------      include "mdee.h"         parameter (FP3=0.5/3.)      real*8 DPE(4),DTE(NTPS)      data DKEO/0./,ISKK/0/**  3.2 Case of Leap-frog - correct velocities due to barostat*      HTSTEP=0.5*TSTEP      if(IAL.eq.3.and.LNVT)then*   3.2.1    Separate thermostat on each molecule type*            (velocity scaled before thermostat parameter correction)        if(LSCTD)then          do I=1,NSTOT	    ITYP = ITYPE(I)            SCV= 1.-SCM(ITYP)*TSTEP	    if(LMOVE(ITYP))then              VX(I) = VX(I)*SCV              VY(I) = VY(I)*SCV              VZ(I) = VZ(I)*SCV            end if          end do*   3.2.2  Common thermostat        else          SCV = 1.-SC*TSTEP          do I=1,NSTOT	    ITYP = ITYPE(I)	    if(LMOVE(ITYP))then               VX(I) = VX(I)*SCV              VY(I) = VY(I)*SCV              VZ(I) = VZ(I)*SCV            end if          end do        end if      end if**  3.3 Recalculate temperatures and pressures*  ---------------*  3.3.1 Calculate temperature          call GETEMP *  3.3.2 Calculate pressure  C        True only for MAST nodeC        This collect virial for "atomic" pressure      VIRSUM	= VIR1+VIR2+VIRB+PELS1+PELS2+SPE+VIRD+     +            VIRA(1)+VIRA(2)+VIRA(3)C        This collect virial for "molecular" pressure      WIRSUM	= VIR1+VIR2+PELS1+PELS2+SPE+VIRD+WIRS+WIRSSCD      write(*,'(5e13.5)')VIR1,VIR2,PELS1,PELS2,SPE,VIRD,WIRS,WIRSSC        Kinetic (ideal gas) contributions to pressure      TRID	= 2.*TKE*UNITP/(3.*VOL)      TRIDM	= NOP*BOLTZ*TEMP*1.d-5/(VOL*UNITL**3)C        Pressure in atm and its projections      TRYCK	= VIRSUM*UNITP/(3.*VOL)+TRID      TRYCKM	= WIRSUM*UNITP/(3.*VOL)+TRIDM C        Projections are calculated for "atomic" pressure      TRYCKX	= (VIRX+VIRFX+VIRD/3.+VIRA(1))*UNITP/VOL+TRID      TRYCKY	= (VIRY+VIRFY+VIRD/3.+VIRA(2))*UNITP/VOL+TRID      TRYCKZ	= (VIRZ+VIRFZ+VIRD/3.+VIRA(3))*UNITP/VOL+TRIDCD	if(TASKID.eq.MAST)write(*,'(5f13.2)')CD     +TRYCK,TRYCKX,TRYCKY,TRYCKZ,(TRYCKX+TRYCKY+TRYCKZ)/3.CC     Now temperature TEMP and pressure TRYCK are defined for the C     current configuration, as well as their components**   3.3.3 Calculate deviation from thermostat T and P      DKE         = TEMP/TRTEMP-1.d0               !  total temperature       do I=1,NTYPESCD         write(*,*)' temp ',I,TEMPR(I),TASKID         DTE(I)   = TEMPR(I)/TRTEMP-1.d0           !  for each species      end doC    in the case of constrained dynamics, pressure is defined by C    "molecule" algorithm - it corresponds scaling of molecular COMC    for flexible molecules, scaling of atom positions is employed,C    which corresponds to the "atomic" pressure C    Exception: case of separate pressure control in each direction C    (LSEP=.true.). Then pressure in each direction is determined fromC    "atomic" pressure.       if(LSHEJK)then	 DPE(1) = TRYCKM-TRPRES      else         DPE(1) = TRYCK -TRPRES      end if      DPE(2) = TRYCKX-TRPRES      DPE(3) = TRYCKY-TRPRES      if(LHEX)then        DPE(2)=0.5*(DPE(2)+DPE(3))

⌨️ 快捷键说明

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