专栏浏览《LAMMPS实例教程—In文件详解》
一、What is 巨正则蒙特卡洛?
G
C
M
C
\rm GCMC
GCMC 即是
G
r
a
n
d
?
c
a
n
o
n
i
c
a
l
?
M
o
n
t
e
?
C
a
r
l
o
\rm Grand\ canonical\ Monte\ Carlo
Grand?canonical?Monte?Carlo,巨正则蒙特卡洛。
“
热
浴
”
“热浴”
“热浴” 这个翻译我觉得很形象,手册中用的是
i
m
a
g
i
n
a
r
y
?
r
e
s
e
r
v
o
i
r
imaginary\ reservoir
imaginary?reservoir。比如
N
V
T
\rm NVT
NVT系综,当采用
N
V
T
\rm NVT
NVT 系综控温时,可以理解为把模拟体系放在一个一定分子数、恒定温度的大热浴中,模拟体系的体积是恒定的、并且不能和大热浴交换分子。显然,根据热力学定律,达到平衡态的时候,模拟体系和热浴的温度相同,这就达到了控温的目的。
那么在GCMC中,模拟体系和一个具有一定化学式
μ
\mu
μ 和一定温度的大热浴接触(这里的大热浴是一个孤立系综)。同时允许模拟体系和大热浴交换粒子数。那么对于这样的开放系统,即粒子数
N
N
N是可以变化的,因此化学势
μ
\mu
μ被引入了热力学的基本方程:
d
E
=
T
d
S
?
P
d
V
+
μ
d
N
dE=TdS-PdV+\mu dN
dE=TdS?PdV+μdN 这里的
μ
\mu
μ就是化学式
C
h
e
m
i
c
a
l
?
p
o
t
e
n
t
i
a
l
\rm Chemical\ potential
Chemical?potential.
那么整个孤立体系(大热浴A和其中的模拟体系B)显然达到热力学平衡的时候,必须满足以下条件:
1). 温度相同:
T
A
=
T
B
T_{A}=T_{B}
TA?=TB?; 2). 压力相同:
P
A
=
P
B
P_{A}=P_{B}
PA?=PB?; 3). 化学势相同:
μ
A
=
μ
B
\mu_{A}=\mu_{B}
μA?=μB?;
显
然
化
学
势
是
对
粒
子
扩
散
趋
势
的
一
种
量
度
。
\color{red} 显然化学势是对粒子扩散趋势的一种量度。
显然化学势是对粒子扩散趋势的一种量度。
二、
L
a
m
m
p
s
\rm Lammps
Lammps如何实现GCMC—
F
i
x
?
G
C
M
C
\rm Fix\ GCMC
Fix?GCMC
1. 核心命令详解
Lammps手册中,对GCMC命令的调用是这样的:
这
里
的
核
心
命
令
:
\color{red} 这里的核心命令:
这里的核心命令:
N
:
每
多
少
步
来
调
用
一
次
,
F
i
x
?
G
C
M
C
;
\rm N :每多少步来调用一次,Fix-GCMC;
N:每多少步来调用一次,Fix?GCMC;
X
:
每
N
步
进
行
约
X
次
的
G
C
M
C
交
换
;
\rm X :每N步进行约X次的GCMC 交换;
X:每N步进行约X次的GCMC交换;
M
:
每
N
步
进
行
尝
试
约
M
个
M
C
移
动
;
\rm M:每N步进行尝试约M个MC移动;
M:每N步进行尝试约M个MC移动;
t
y
p
e
:
插
入
原
子
的
类
型
;
\rm type:插入原子的类型;
type:插入原子的类型;
s
e
e
d
:
随
机
数
种
子
;
\rm seed:随机数种子;
seed:随机数种子;
T
:
上
文
提
到
的
大
热
浴
的
温
度
;
\rm T:上文提到的大热浴的温度;
T:上文提到的大热浴的温度;
μ
:
化
学
势
;
\rm \mu:化学势;
μ:化学势;
d
i
s
p
l
a
c
e
:
M
C
移
动
的
最
大
距
离
;
\rm displace:MC移动的最大距离;
displace:MC移动的最大距离;
m
c
m
o
v
e
s
:
M
C
移
动
中
的
原
子
比
例
;
\rm mcmoves: MC移动中的原子比例;
mcmoves:MC移动中的原子比例;
r
i
g
i
d
:
F
i
x
?
r
i
g
i
d
/
s
m
a
l
l
命
令
的
I
D
;
\rm rigid: Fix-rigid/small 命令的ID;
rigid:Fix?rigid/small命令的ID;
s
h
a
k
e
:
f
i
x
?
I
D
,
f
i
x
?
s
h
a
k
e
的
命
令
;
\rm shake: fix-ID,fix-shake的命令;
shake:fix?ID,fix?shake的命令;
r
e
g
i
o
n
:
r
e
g
i
o
n
?
I
D
进
行
G
C
M
C
的
区
域
;
\rm region: region-ID 进行GCMC的区域;
region:region?ID进行GCMC的区域;
f
u
g
a
c
i
t
y
c
o
e
f
f
:
逸
度
系
数
;
\rm fugacity_coeff: 逸度系数;
fugacityc?oeff:逸度系数;
f
u
l
l
e
n
e
r
g
y
:
进
行
G
C
M
C
交
换
时
计
算
体
系
总
能
量
;
\rm full_energy: 进行GCMC交换时计算体系总能量;
fulle?nergy:进行GCMC交换时计算体系总能量;
c
h
a
r
g
e
:
插
入
原
子
的
电
荷
量
;
\rm charge: 插入原子的电荷量;
charge:插入原子的电荷量;
g
r
o
u
p
:
插
入
原
子
到
哪
个
g
r
o
u
p
;
\rm group: 插入原子到哪个group;
group:插入原子到哪个group;
g
r
o
u
p
t
y
p
e
:
t
y
p
e
:
插
入
原
子
的
类
型
;
\rm grouptype: type:插入原子的类型;
grouptype:type:插入原子的类型;
g
r
o
u
p
I
D
插
入
到
哪
个
g
r
o
u
p
;
\rm group ID 插入到哪个group;
groupID插入到哪个group;
t
f
a
c
_
i
n
s
e
r
t
:
按
比
例
提
高
/
降
低
插
入
原
子
的
温
度
;
\rm tfac\_insert: 按比例提高/降低插入原子的温度;
tfac_insert:按比例提高/降低插入原子的温度;
o
v
e
r
l
a
p
_
c
u
t
o
f
f
:
删
除
重
叠
原
子
的
最
大
距
离
;
\rm overlap\_cutoff: 删除重叠原子的最大距离;
overlap_cutoff:删除重叠原子的最大距离;
关于分子模板请参考《LAMMPS 中 molecule command 的分子模板》
2. 需要注意自由度
由于体系中,允许粒子数的改变,这里需要对温度进行修正,手册中也给出了解释。
3. MD+MC的设置
当体系中的温度采用
F
i
x
?
N
V
T
Fix\ NVT
Fix?NVT 进行控温时,就是一个GCMC+MD的模拟。当然NVT的温度必须设置为和GCMC中目标温度相同。同样的自由度的问题也需要修正。
4.
t
f
a
c
_
i
n
s
e
r
t
\rm tfac\_insert
tfac_insert 关键词的理解
这里由于插入的原子或者分子,根据系统目标来指定,并且分子是
r
i
g
i
d
\rm rigid
rigid,这会导致插入原子的“温度”较低。因此,需要采用一个因子:
t
f
a
c
_
i
n
s
e
r
t
\rm tfac\_insert
tfac_insert,来尽快平衡。Lammps 官方给出的案例中采用了这样的方法:
# gcmc
variable tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans)
fix mygcmc co2 gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol &
co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt
# atom counts
5. 化学势
μ
\rm \mu
μ 的设置
根据上面的讨论我们可以看到,插入和删除原子会导致体系的化学势
μ
\mu
μ 和压力
p
p
p的改变。这里手册中对于化学势的计算是: 我们通过化简得到:
e
μ
k
b
T
=
?
P
Λ
3
k
b
T
e^{\frac{\mu}{k_bT} }=\frac{\phi P\Lambda^{3}}{k_bT}
ekb?Tμ?=kb?T?PΛ3? 显然,化学势和压力存在以上的对应关系。那么在设置的时候,可以通过直接指定压力,无需设置化学势。这里在论坛中我也找到了对应的讨论可以参考。
注
意
!
!
!
\color{red} 注意!!!
注意!!!
指定等同於指定化學勢只對單組分系統管用。單組分系統的miu 是T和p的函數。而多組分的時候miu = f (T, p, nA, nB…)
二、代码实现—GCMC甲烷和二氧化碳的竞争吸附
1. 循环不同压力的设置
#---------------------------------------------------------------------------#
#---------------------------------------------------------------------------#
# loop make all_file
echo screen
print " ------------------------------------------------"
print " -----------------NOW making files---------------"
print " ------------------------------------------------"
label out_makefile
variable number_out loop 1
variable file_name_out index 1
shell mkdir ${file_name_out}
shell cp CH4.txt ${file_name_out}
shell cp CO2.txt ${file_name_out}
shell cp gra_layer.data ${file_name_out}
next number_out
next file_name_out
jump SELF out_makefile
clear
print "--------------------------------------------"
print "------------------ Finish! -----------------"
print "--------------------------------------------"
#-----------------------------------------------------------------#
label calculation_in_outfile
variable loop_number_out loop 1
variable loop_file_out_name index 1
shell cd ${loop_file_out_name}
log ${loop_file_out_name}.log
2. 物理模型构建
###################
# initial setting #
###################
#echo screen
units metal
dimension 3
boundary p p p
atom_style full
bond_style harmonic
angle_style harmonic
#----------------------------------------------------------#
variable TS equal 0.0001 ### ${TS} timestep
variable Tdamp equal 100*${TS} ### ${Tdamp} Tdamp
variable T equal 300 ### ${T} initial temperature
variable Height equal 100 ### ${Height} height between two plate
variable w_down equal 18 ###
variable w_up equal 16+${Height} ###
#----------------------------------------------------------#
region box block 0 100 0 100 0 100 units box
create_box 5 box &
bond/types 2 &
angle/types 2 &
extra/bond/per/atom 10 &
extra/angle/per/atom 10 &
extra/special/per/atom 10
#----------------------------------------------------------#
read_data gra_layer.data &
add append nocoeff &
group graphene_down
read_data gra_layer.data &
add append nocoeff &
shift 0 0 ${w_up} &
group graphene_up
#----------------------------------------------------------#
# for CO2
bond_coeff 1 0 1.16
angle_coeff 1 0 180
# for CH4
bond_coeff 2 14.35 1.09
angle_coeff 2 1.517 109.5
#----------------------------------------------------------#
# setting mass
mass 1 12 # C
mass 2 16 # water-O
mass 3 1 # water-H
mass 4 12 # CH4-C
mass 5 16 # CH4-O
# make gas region
#----------------------------------------------------------#
region gas_block block &
20 80 &
20 80 &
30 70 units box
molecule CO2 CO2.txt toff 1
create_atoms 0 random 1 12345 gas_block mol CO2 12345
#----------------------------------------------------------#
# make Ch4
molecule CH4 CH4.txt toff 3 boff 1 aoff 1
#create_atoms 0 random 1 12345 gas_block mol CH4 55534
#----------------------------------------------------------#
###################
# group setting #
###################
#----------------------------------------------------------#
group gra type 1
group CO_C type 2
group CO_O type 3
group CH_C type 4
group CH_H type 5
group graphene type 1
group CO2 type 2 3
group CH4 type 4 5
group all_gas type 2 3 4 5
set type 1 charge 0.0
set type 2 charge 0.7
set type 3 charge -0.35
set type 4 charge -0.24
set type 5 charge 0.06
#----------------------------------------------------------#
write_data 11.data
#----------------------------------------------------------#
# graphene-1; CO_C-2; CO_O-3; CH_C-4; CH_H-5;
#----------------------------------------------------------#
3. 力场设置
#----------------------------------------------------------#
# graphene-1; CO_C-2; CO_O-3; CH_C-4; CH_H-5;
#----------------------------------------------------------#
pair_style lj/cut/coul/long 12
pair_modify mix arithmetic tail yes
pair_coeff 1 1 0.003034 3.55 # gra-gra
# rigid CO2 TraPPE model
pair_coeff 2 2 0.053649 2.8
pair_coeff 3 3 0.156973 3.05
pair_coeff 4 4 0.002864 3.5 # CH_C CH_C
pair_coeff 5 5 0.001300 2.5 # CH_C CH_C
neigh_modify exclude type 1 1
#--------------------------------------------------------------#
kspace_style pppm 1.0e-5 1.0e-6
velocity all_gas create ${T} 12345 loop local #
#minimize 1.0e-5 1.0e-7 1000 10000
neighbor 2 bin
neigh_modify every 1 delay 10 check yes
4. MD+GCMC模拟
# rigid constraints with thermostat
fix CO2_nvt CO2 rigid/nvt/small molecule temp ${T} ${T} ${Tdamp} mol CO2
fix_modify CO2_nvt dynamic/dof yes
# rigid constraints with thermostat
#fix CH4_nvt CH4 rigid/nvt/small molecule temp ${T} ${T} ${Tdamp} mol CH4
#fix_modify CH4_nvt dynamic/dof yes
fix mygcmc_CO2 CO2 gcmc 100 100 0 0 54341 ${T} 0 1 mol &
CO2 pressure 10 region box rigid CO2_nvt
fix mygcmc_CH4 CH4 gcmc 100 100 0 0 12321 ${T} 0 1 mol &
CH4 pressure 10 region box
compute_modify thermo_temp dynamic/dof yes
三、全部代码
###################################################################
# Author Email: lammps_materials@163.com #
###################################################################
#---------------------------------------------------------------------------#
#---------------------------------------------------------------------------#
# loop make all_file
echo screen
print " ------------------------------------------------"
print " -----------------NOW making files---------------"
print " ------------------------------------------------"
label out_makefile
variable number_out loop 1
variable file_name_out index 1
shell mkdir ${file_name_out}
shell cp CH4.txt ${file_name_out}
shell cp CO2.txt ${file_name_out}
shell cp gra_layer.data ${file_name_out}
next number_out
next file_name_out
jump SELF out_makefile
clear
print "--------------------------------------------"
print "------------------ Finish! -----------------"
print "--------------------------------------------"
#-----------------------------------------------------------------#
label calculation_in_outfile
variable loop_number_out loop 1
variable loop_file_out_name index 1
shell cd ${loop_file_out_name}
log ${loop_file_out_name}.log
###################
# initial setting #
###################
#echo screen
units metal
dimension 3
boundary p p p
atom_style full
bond_style harmonic
angle_style harmonic
#----------------------------------------------------------#
variable TS equal 0.0001 ### ${TS} timestep
variable Tdamp equal 100*${TS} ### ${Tdamp} Tdamp
variable T equal 300 ### ${T} initial temperature
variable Height equal 100 ### ${Height} height between two plate
variable w_down equal 18 ###
variable w_up equal 16+${Height} ###
#----------------------------------------------------------#
region box block 0 100 0 100 0 100 units box
create_box 5 box &
bond/types 2 &
angle/types 2 &
extra/bond/per/atom 10 &
extra/angle/per/atom 10 &
extra/special/per/atom 10
#----------------------------------------------------------#
read_data gra_layer.data &
add append nocoeff &
group graphene_down
read_data gra_layer.data &
add append nocoeff &
shift 0 0 ${w_up} &
group graphene_up
#----------------------------------------------------------#
# for CO2
bond_coeff 1 0 1.16
angle_coeff 1 0 180
# for CH4
bond_coeff 2 14.35 1.09
angle_coeff 2 1.517 109.5
#----------------------------------------------------------#
# setting mass
mass 1 12 # C
mass 2 16 # water-O
mass 3 1 # water-H
mass 4 12 # CH4-C
mass 5 16 # CH4-O
# make gas region
#----------------------------------------------------------#
region gas_block block &
20 80 &
20 80 &
30 70 units box
molecule CO2 CO2.txt toff 1
create_atoms 0 random 1 12345 gas_block mol CO2 12345
#----------------------------------------------------------#
# make Ch4
molecule CH4 CH4.txt toff 3 boff 1 aoff 1
#create_atoms 0 random 1 12345 gas_block mol CH4 55534
#----------------------------------------------------------#
###################
# group setting #
###################
#----------------------------------------------------------#
group gra type 1
group CO_C type 2
group CO_O type 3
group CH_C type 4
group CH_H type 5
group graphene type 1
group CO2 type 2 3
group CH4 type 4 5
group all_gas type 2 3 4 5
set type 1 charge 0.0
set type 2 charge 0.7
set type 3 charge -0.35
set type 4 charge -0.24
set type 5 charge 0.06
#----------------------------------------------------------#
write_data 11.data
#----------------------------------------------------------#
# graphene-1; CO_C-2; CO_O-3; CH_C-4; CH_H-5;
#----------------------------------------------------------#
pair_style lj/cut/coul/long 12
pair_modify mix arithmetic tail yes
pair_coeff 1 1 0.003034 3.55 # gra-gra
# rigid CO2 TraPPE model
pair_coeff 2 2 0.053649 2.8
pair_coeff 3 3 0.156973 3.05
pair_coeff 4 4 0.002864 3.5 # CH_C CH_C
pair_coeff 5 5 0.001300 2.5 # CH_C CH_C
neigh_modify exclude type 1 1
#--------------------------------------------------------------#
kspace_style pppm 1.0e-5 1.0e-6
velocity all_gas create ${T} 12345 loop local #
#minimize 1.0e-5 1.0e-7 1000 10000
neighbor 2 bin
neigh_modify every 1 delay 10 check yes
#--------------------------------------------------------------#
# rigid constraints with thermostat
fix CO2_nvt CO2 rigid/nvt/small molecule temp ${T} ${T} ${Tdamp} mol CO2
fix_modify CO2_nvt dynamic/dof yes
# rigid constraints with thermostat
#fix CH4_nvt CH4 rigid/nvt/small molecule temp ${T} ${T} ${Tdamp} mol CH4
#fix_modify CH4_nvt dynamic/dof yes
fix mygcmc_CO2 CO2 gcmc 100 100 0 0 54341 ${T} 0 1 mol &
CO2 pressure 10 region box rigid CO2_nvt
fix mygcmc_CH4 CH4 gcmc 100 100 0 0 12321 ${T} 0 1 mol &
CH4 pressure 10 region box
compute_modify thermo_temp dynamic/dof yes
#--------------------------------------------------------------#
thermo 1000
thermo_style custom step temp press
variable 1000ps equal 100/${TS}
dump 123 all custom 500 dump.123 &
id type x y z vx vy vz fx fy fz
#--------------------------------------------------------------#
###################
# run 1 #
###################
run ${1000ps}
#run 1
#--------------------------------------------------------------#
write_data final.data
shell cd ..
clear
next loop_file_out_name
jump SELF calculation_in_outfile
四、
L
a
m
m
p
s
\rm Lammps
Lammps 给出的案例
# GCMC for CO2 molecular fluid, rigid/small/nvt dynamics
# Rigid CO2 TraPPE model
# [Potoff and J.I. Siepmann, Vapor-liquid equilibria of
# mixtures containing alkanes, carbon dioxide and
# nitrogen AIChE J., 47,1676-1682 (2001)].
# variables available on command line
variable mu index -8.1
variable disp index 0.5
variable temp index 338.0
variable lbox index 10.0
variable spacing index 5.0
# global model settings
units real
atom_style full
boundary p p p
pair_style lj/cut/coul/long 14
pair_modify mix arithmetic tail yes
kspace_style ewald 0.0001
bond_style harmonic
angle_style harmonic
# box, start molecules on simple cubic lattice
lattice sc ${spacing}
region box block 0 ${lbox} 0 ${lbox} 0 ${lbox} units box
create_box 2 box &
bond/types 1 &
angle/types 1 &
extra/bond/per/atom 2 &
extra/angle/per/atom 1 &
extra/special/per/atom 2
molecule co2mol CO2.txt
create_atoms 0 box mol co2mol 464563 units box
# rigid CO2 TraPPE model
pair_coeff 1 1 0.053649 2.8
pair_coeff 2 2 0.156973 3.05
bond_coeff 1 0 1.16
angle_coeff 1 0 180
# masses
mass 1 12.0107
mass 2 15.9994
# MD settings
group co2 type 1 2
neighbor 2.0 bin
neigh_modify every 1 delay 10 check yes
velocity all create ${temp} 54654
timestep 1.0
# rigid constraints with thermostat
fix myrigidnvt co2 rigid/nvt/small molecule temp ${temp} ${temp} 100 mol co2mol
# dynamically update fix rigid/nvt/small temperature ndof
fix_modify myrigidnvt dynamic/dof yes
# gcmc
variable tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans)
fix mygcmc co2 gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol &
co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt
# atom counts
variable carbon atom "type==1"
variable oxygen atom "type==2"
group carbon dynamic co2 var carbon
group oxygen dynamic co2 var oxygen
variable nC equal count(carbon)
variable nO equal count(oxygen)
# output
variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
# dynamically update default temperature ndof
compute_modify thermo_temp dynamic/dof yes
thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO
thermo 1000
# run
run 20000
|