24小时热门版块排行榜    

查看: 8716  |  回复: 80
本帖产生 2 个 模拟EPI ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

qphll

金虫 (正式写手)

[交流] 【原创】抛土引玉, Monte Carlo 如何自己写程序: NVT_LJ已有57人参与

引子: 注册小木虫很多年了, 一直是条小虫子, 也喜欢这样的论坛, 有虫, 有大虫, 有菜, 也有肉. 在学术和科研这个大盘子上面, 谁都是小虫子, 谁都能成为某一方向的专家.或许大家内心偶尔还是有那种"为中华之崛起而读书"的热血冲动, 但是更多时候, 为现实的残酷而黯然, 为学海之无涯而沮丧. 但是正像虫卵可以慢慢长成小虫一样, 只要你不断努力, 小虫也会破茧成为美丽的蝴蝶.

不管哭与笑, 不论败与成, Keep fighting, Never give up.

与大家共勉.

qphll
Nov. 24, 2010
回复此楼

» 收录本帖的淘帖专辑推荐

材料计算模拟实用技巧 分子模拟 生活休闲 学习方法
condensed matter physics 第一性原理和电化学 量子化学理论及量化软件专辑 量化,第一性,MD笔记
分子生物物理理论

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

Life, Love, Laugh.
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

qphll

金虫 (正式写手)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
ghcacj(金币+10, 模拟EPI+1):鼓励 2010-11-25 09:24:33
MODULE global_variables
  
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! Contains all the global variables that will be used in the program !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  !     qphll                                                          !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! Number of particles  
!----------------------------------------------------------------------!  
  ! Number of nitrogen molecules
  INTEGER :: n_molecules
  
  INTEGER,PARAMETER :: n_molecules_max=1000
  

! Positions
!----------------------------------------------------------------------!
  ! Positions of the centers of mass of the N molec.
  DOUBLE PRECISION,DIMENSION(n_molecules_max) :: rx, ry, rz
  

! Geometry  
!----------------------------------------------------------------------!
  ! Simulation box length
  DOUBLE PRECISION :: box

! Lennard Jones parameters
  DOUBLE PRECISION :: sig
  DOUBLE PRECISION :: eps

! Physical variables
!----------------------------------------------------------------------!
  ! Temperature (non-dimensional)
  DOUBLE PRECISION :: temp

  ! Energy, etc
  DOUBLE PRECISION :: energy

  ! Block accumulators
  DOUBLE PRECISION :: blkener, blkpress, blkenersq

  ! Virial and pressure
  DOUBLE PRECISION :: pressure

! Parameters
!----------------------------------------------------------------------!
  ! Cutoff distances
  DOUBLE PRECISION :: cutoff_nn, cutoff_nn_square

  ! Very small distances will cause huge energies
  DOUBLE PRECISION, PARAMETER :: huge_number = 10000
  DOUBLE PRECISION :: small_rsq_nn, huge_energy


! Acceptance/Rejections Statistics
!----------------------------------------------------------------------!
  ! Translation statistics
  INTEGER :: acctrans, ntrans


! Monte Carlo parameters
!----------------------------------------------------------------------!
  ! Number of blocks
  INTEGER :: nblocks

  ! Number of steps per block
  INTEGER :: nsteps

  ! Maximum displacement in a MC move
  DOUBLE PRECISION :: maxdisp

  ! Adjust the parameter maxdisp every nadjust blocks
  INTEGER :: nadjust

! Radial distribution function
!----------------------------------------------------------------------!
  INTEGER,PARAMETER :: maxbin = 200
  INTEGER, DIMENSION(maxbin) :: hist
  DOUBLE PRECISION :: delr,constant
  INTEGER :: nsamplegr,totalsamplesgr

! DCD file output
!----------------------------------------------------------------------!
  INTEGER :: dcd_freq

! Others
!----------------------------------------------------------------------!
  ! Dummy variable for random number generator
  INTEGER :: idum

  ! Random number generator
  DOUBLE PRECISION,EXTERNAL :: random

  ! Pi
  DOUBLE PRECISION,PARAMETER :: Pi = 3.141592d0
  DOUBLE PRECISION,PARAMETER :: Kb = 1.3806d-23  ! J/K
  DOUBLE PRECISION,PARAMETER :: Na = 6.0221d23   ! 1/mol
  DOUBLE PRECISION,PARAMETER :: R = Kb*Na        ! J/(mol K)
  DOUBLE PRECISION,PARAMETER :: Pp = Kb*1.0d+30  ! (J cu.A)/(K cu.M) OR (Pa cu.A)/K
  DOUBLE PRECISION,PARAMETER :: Pb = Pp*1.0d-5   ! (bar cu. A)


END MODULE global_variables

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PROGRAM nvt

  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! Main program                                                       !
  ! Procedures used:                                                   !
  !  - start, runner, finish                                           !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! qphll                                                              !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  USE global_variables
  IMPLICIT NONE

  CALL start
  CALL runner
  CALL finish

  STOP

END PROGRAM nvt

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

SUBROUTINE runner

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! Performs 'nblocks' blocks of 'nsteps' Monte Carlo steps            !
  !                                                                    !
  ! Procedures used:                                                   !
  !  - random                                                          !
  !  - translate                                                       !
  !  - total_energy                                                    !
  !  - adjust_mc_parameters                                            !
  !                                                                    !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! qphll                                                              !
  !                                                                    !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  USE global_variables
  IMPLICIT NONE

  ! Local variables
  INTEGER :: iblock, istep
  DOUBLE PRECISION :: etest, ptest, Utest, Wtest

  ! Calculate the total energy
  CALL total_energy(energy,pressure)

  ! Perform runs over blocks
  DO iblock=1,nblocks

     ! Set block accumulators to zero
     blkener = 0.0d0
     blkenersq = 0.0d0
     blkpress = 0.0d0

     ! Perform runs over steps
     DO istep=1,nsteps

        ! Perform an MC step
        CALL translate

        ! Update block accumulators
        blkener = blkener + energy
        blkpress = blkpress + pressure
        blkenersq = blkenersq + energy**2

        ! End loop over steps
     END DO


        ! Average properties at the end of the block
        blkener = blkener / DBLE(nsteps)/DBLE(n_molecules)
        blkenersq = blkenersq / REAL(nsteps)/DBLE(n_molecules)**2
        blkpress = blkpress / DBLE(nsteps)

    CALL total_energy(energy,pressure)

        ! Write bulk properties to file
        IF(sig == 1.0 .AND. eps == 1.0) THEN

          ! Write results in output file
          WRITE(40,FMT='(I5,F18.6,F24.6,F18.6)') &
               &iblock,blkener,blkenersq,&
               &((n_molecules*temp-blkpress)/box**3)

        ELSE

          ! Write results in output file
          WRITE(40,FMT='(I5,F18.6,F24.6,F18.6)') &
               &iblock,R*blkener,(R**2)*blkenersq,&
               &Pb*((n_molecules*temp-blkpress)/box**3)

        END IF


        ! Adjust MC parameters
        IF (MOD(iblock,nadjust) == 0) CALL adjust_mc_parameters

        ! Sample radial distribution function
        IF (MOD(iblock,nsamplegr) == 0) CALL sample_gr

        ! Write to the DCD file
        CALL write_dcd(iblock)
   
     ! End loop over blocks
  END DO

  ! Close output file
  CLOSE(UNIT=40)

  RETURN

END SUBROUTINE runner

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



REAL FUNCTION random(idum)

  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! Generates a random number between 0.0 and 1.0                      !
  ! Modification of ran3, taken from "Numerical Recipes in Fortran"    !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! qphll                                                              !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  IMPLICIT NONE

  
  ! Local variables
  REAL, PARAMETER :: mbig=4000000., mseed=1618033., mz=0., fac=1./mbig
  INTEGER :: idum,i, ii,  k
  INTEGER, SAVE :: iff, inext, inextp
  REAL :: mj, mk
  REAL, SAVE :: ma(55)
  DATA iff /0/


  ! Initialization
  IF(idum<0.OR.iff==0) THEN
     iff=1
     mj=mseed-IABS(idum)
     mj=MOD(mj, mbig)
     ma(55)=mj
     mk=1

     DO i=1,54
        ii=MOD(21*i,55)
        ma(ii)=mk
        mk=mj-mk
        IF(mk         mj=ma(ii)
     END DO
     DO k=1,4
        DO i=1,55
           ma(i)=ma(i)-ma(1+MOD(i+30,55))
           IF(ma(i)         END DO
     END DO
     inext=0
     inextp=31
     idum=1
  END IF

  ! Start to generate the random number

  inext=inext+1
  IF(inext==56) inext=1
  inextp=inextp+1
  IF(inextp==56) inextp=1
  mj=ma(inext)-ma(inextp)
  IF(mj   ma(inext)=mj
  random=mj*fac
  RETURN

END FUNCTION random

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

SUBROUTINE  initialize_idum(idum)

  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! Initializes the seed of the random number generator                !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! qphll                                                              !
  !                                                                    !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  IMPLICIT NONE

  ! Local variables
  INTEGER :: idum
  INTEGER, DIMENSION(8) :: val

  idum = -478

!!$  CALL DATE_AND_TIME(VALUES=val)
!!$  idum=-(1000*val(7)+val(8))
  RETURN

END SUBROUTINE initialize_idum

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


SUBROUTINE translate

  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! Generates a random displacement of a molecule itest                !
  ! selected randomly                                                  !
  !                                                                    !
  ! Procedures used:                                                   !
  !  - random(idum): random number generator                           !
  !  - energy_calculation                                              !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !                                                                    !
  ! qphll                                                              !
  !                                                                    !
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  USE global_variables
  IMPLICIT NONE

  ! Local variables
  INTEGER :: imol
  DOUBLE PRECISION :: rx_old, ry_old, rz_old
  DOUBLE PRECISION :: rx_new, ry_new, rz_new
  DOUBLE PRECISION :: vold, vnew, deltav,virialold,virialnew
  LOGICAL :: accepted


  ! Select the particle to be translated
  imol = INT(random(idum) * n_molecules) + 1
  
  ! Read the current position of the molecule itest
  rx_old = rx(imol)
  ry_old = ry(imol)  
  rz_old = rz(imol)

  ! Calculate energy with the old position
  CALL energy_calculation(imol,rx_old,ry_old,rz_old,vold,virialold)

  ! Assign the new position randomly
  ! The maximum displacement is given by maxdisp
  rx_new = rx_old + maxdisp * (2.0d0*random(idum)-1.0d0)
  ry_new = ry_old + maxdisp * (2.0d0*random(idum)-1.0d0)
  rz_new = rz_old + maxdisp * (2.0d0*random(idum)-1.0d0)

  ! Apply periodic boundary conditions
  rx_new = rx_new - DNINT(rx_new/box)*box
  ry_new = ry_new - DNINT(ry_new/box)*box
  rz_new = rz_new - DNINT(rz_new/box)*box

  ! Calculate the energy with the new position
  CALL energy_calculation(imol,rx_new,ry_new,rz_new,vnew,virialnew)

  ! Calculate difference in potential energy
  deltav = vnew - vold

  ! Apply the acceptance criteria
  IF (deltav < 0.0d0) THEN
     accepted = .TRUE.
  ELSEIF (deltav >= (huge_energy-1.0d0)) THEN
     accepted = .FALSE.
  ELSEIF (random(idum) < dEXP(-deltav/temp)) THEN
     accepted = .TRUE.
  ELSE
     accepted = .FALSE.
  END IF

  ! If the move is accepted...
  IF (accepted) THEN
     
     ! Update the number of accepted translation moves
     acctrans = acctrans + 1

     ! Update positions
     rx(imol) = rx_new
     ry(imol) = ry_new
     rz(imol) = rz_new

     ! Update the value of the energy
     energy = energy + deltav

     ! Update the value of pressure
     pressure = pressure + virialnew - virialold
  END IF

  ! Update the number of translation moves
  ntrans = ntrans + 1
!WRITE(*,10) imol, vold, vnew, energy, pressure
!10 FORMAT(I3, 2X F11.6, 2X, F11.6, 2X, F11.6, 2X, F11.6, 2X, F11.6)

  RETURN

END SUBROUTINE translate
Life, Love, Laugh.
4楼2010-11-25 00:58:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 qphll 的主题更新
普通表情 高级回复(可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考博] 要不要加博导微信 +5 姑且随风而去 2024-12-24 9/450 2024-12-25 00:08 by 烂虾臭鱼
[硕博家园] 四线城市公办高校无编or二线城市民办高校 +16 joshhartford 2024-12-20 35/1750 2024-12-24 23:35 by ?h語言達蜀黍
[教师之家] 你们都降薪了吗? +15 红枣葡萄干 2024-12-18 16/800 2024-12-24 23:20 by 沉默如昔
[硕博家园] 纠结退学ing +22 幽皮皮皮 2024-12-22 37/1850 2024-12-24 21:06 by 书剑如风
[考博] 自己找博士可真难啊 +9 鸡腿啦啦啦 2024-12-23 16/800 2024-12-24 19:30 by Andy_124
[能源] 研一新生(无科研经历)求助 10+3 不会sa 2024-12-23 5/250 2024-12-24 17:27 by LN蓝天绿树
[教师之家] 咨询一下,是不是教授之间比较忌讳谈论文造假,因为可能很多人都是造假 +11 akslis2024 2024-12-21 12/600 2024-12-24 14:10 by 六两废铜
[考研] 26考研 +9 青云要冲沪深 2024-12-21 9/450 2024-12-24 11:09 by zjhzclm
[考博] 中山医学院生物信息申博 +4 wcy98117 2024-12-22 4/200 2024-12-24 11:08 by zjhzclm
[论文投稿] International Journal of Biological Macromolecules 10+4 123smiles 2024-12-22 6/300 2024-12-24 09:15 by 123smiles
[有机交流] 3-溴呋喃到甲氧基呋喃 +4 dyl7838 2024-12-20 7/350 2024-12-24 08:49 by 091602
[论文投稿] 挑数据是造假吗 +11 电话的建设 2024-12-21 11/550 2024-12-24 08:33 by 我乘着风
[考博] 2025届化工专业博士申请 5+3 Hkeyan 2024-12-23 4/200 2024-12-24 08:17 by babero
[考博] 2025申博 +3 梁艺艺 2024-12-21 4/200 2024-12-24 06:20 by firen2020
[论文投稿] 污染物降解的矿化特性 +9 透明的心sky 2024-12-23 12/600 2024-12-24 00:42 by 透明的心sky
[论文投稿] 请问ICASSP必须要去参会吗? 5+3 火炎焱烤猪 2024-12-21 4/200 2024-12-23 16:39 by bluestork
[找工作] 水电解制氢方向求职 +6 kyle1999 2024-12-19 13/650 2024-12-23 10:02 by kyle1999
[考博] 申博的科研计划书怎么写? +6 爱喝风的龙卷茶 2024-12-19 11/550 2024-12-23 07:55 by vincent_hpax
[硕博家园] 招聘博士 +7 大发财树 2024-12-18 8/400 2024-12-21 16:17 by yanjiaming
[教师之家] 今年的科研绩效只奖励Q1了 +12 holypower 2024-12-20 17/850 2024-12-21 16:13 by willbuilder
信息提示
请填处理意见